scripts.go 4.27 KB
Newer Older
1 2 3 4 5 6 7 8
package scripts

import (
	"encoding/json"
	"log"
)

type (
Lukas Burgey's avatar
Lukas Burgey committed
9 10
	// Credential is currently a ssh key, but may be a password hash in the future
	Credential struct {
11
		ID    int    `json:"id,omitempty"`
Lukas Burgey's avatar
Lukas Burgey committed
12 13 14 15 16
		Type  string `json:"type,omitempty"`
		Name  string `json:"name"`
		Value string `json:"value"`
	}

17 18
	// UserCredentialStates serves to inform the backend about the per credential states
	// after the script run
Lukas Burgey's avatar
Lukas Burgey committed
19 20
	// This maps a credential type like "ssh_key" to a map of the states of credentials of this
	// type.
21 22
	UserCredentialStates map[string]map[string]State

23 24 25
	// UserCredentials maps a credential type to the credentials of this type
	UserCredentials map[string][]Credential

26 27 28
	// UserInfo info about the user
	UserInfo map[string]interface{}

29
	// User contains information concerning the user of a deployment
30
	User struct {
31
		UserInfo    UserInfo        `json:"userinfo"`
32
		Credentials UserCredentials `json:"credentials"`
33 34 35 36 37 38 39 40 41 42 43
	}

	// Input of the deployment script
	Input struct {
		// StateTarget is the state which is to be reached by this deployment task
		// StateTarget is either Deployed or NotDeployed
		StateTarget State `json:"state_target"`

		// User describes the user of this deployment task
		User User `json:"user"`

Lukas Burgey's avatar
Lukas Burgey committed
44
		// Answers is an answered questionnaire
45 46 47
		// Maps a question name to the answer of the user
		// The keys (question names) *must* be identical to those of the Output.Questionnaire
		// containing the questions
Lukas Burgey's avatar
Lukas Burgey committed
48
		Answers map[string]string `json:"answers,omitempty"`
49 50 51 52
	}

	// Output of the deployment script
	Output struct {
Lukas Burgey's avatar
Lukas Burgey committed
53 54 55
		// State describes the state of the deployment, after the script execution.
		// When State == Questionnaire then Output.Questionnaire *must* be set.
		// When State == Deployed then Output.Credentials *can* be set.
56 57
		State State `json:"state"`

Lukas Burgey's avatar
Lukas Burgey committed
58
		// Msg is a message for the user.
59 60 61
		Msg string `json:"message"`

		// Questionnaire requested by the script
Lukas Burgey's avatar
Lukas Burgey committed
62 63
		// This field is Ignored when Output.State is not Questionnaire.
		// Questionnaire maps a question name to a question.
64
		Questionnaire map[string]string `json:"questionnaire,omitempty"`
65

Lukas Burgey's avatar
Lukas Burgey committed
66 67 68 69
		// Credentials are additionnal credentials for the user.
		// Examples are additional passwords.
		// This field is ignored by the client when Output.State is not Deployed.
		// Credentials maps a credential name to a credential value.
70
		Credentials map[string]string `json:"credentials,omitempty"`
71

72 73 74
		// UserCredentialStates are the State s of the credentials found in Input.User.Credentials.
		// This field is not mandatory. The client will assume that all credentials have the State
		// Output.State if this field is not given.
75
		UserCredentialStates UserCredentialStates `json:"user_credential_states,omitempty"`
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
	}

	// State is a string enum
	// The enum values for State are listed below
	State string
)

const (
	// Deployed value for State
	Deployed State = "deployed"

	// NotDeployed value for State
	NotDeployed State = "not_deployed"

	// Rejected value for State
	// the user can never be deployed
	Rejected State = "rejected"

	// Failed value for State
	// the deployment can be retried
	Failed State = "failed"

	// Questionnaire value for State
	// the user has to fill the questionnaire
	// with the questionnaire data the deployment can be retried
	Questionnaire State = "questionnaire"
)

func (u User) String() string {
Lukas Burgey's avatar
Lukas Burgey committed
105 106 107 108 109 110 111
	if email, ok := u.UserInfo["email"]; ok {
		return email.(string)
	}
	if name, ok := u.UserInfo["name"]; ok {
		return name.(string)
	}
	return ""
112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
}

func (i Input) String() string {
	iBytes, err := i.Marshal()
	if err != nil {
		log.Fatal(err)
	}
	return string(iBytes)
}

func (o Output) String() string {
	oBytes, err := o.Marshal()
	if err != nil {
		log.Fatal(err)
	}
	return string(oBytes)
}

// Marshal encodes an Input as json
func (i Input) Marshal() (iBytes []byte, err error) {
	iBytes, err = json.MarshalIndent(i, "", "    ")
	return
}

// Marshal encodes an Output as json
func (o Output) Marshal() (oBytes []byte, err error) {
	oBytes, err = json.MarshalIndent(o, "", "    ")
	return
}

// UnmarshalInput decodes a json encoded input
func UnmarshalInput(inputBytes []byte) (i Input, err error) {
	err = json.Unmarshal(inputBytes, &i)
	return
}

// UnmarshalOutput decodes a json encoded output
func UnmarshalOutput(inputBytes []byte) (i Output, err error) {
	err = json.Unmarshal(inputBytes, &i)
	return
}