command

package
v0.0.0-...-61d19a0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 19, 2019 License: MPL-2.0 Imports: 24 Imported by: 0

Documentation

Index

Constants

View Source
const (
	// NonEmptuTokenVal ...
	NonEmptuTokenVal = "non_empty_token"
	// NonAdminVal ...
	NonAdminVal = "non_admin"
)

Variables

AWSVCloudFlags : All aws vcloud provider flags

View Source
var AddAdminUser = cli.Command{
	Name:        "add",
	Usage:       h.T("user.admin.add.usage"),
	ArgsUsage:   h.T("user.admin.add.args"),
	Description: h.T("user.admin.add.description"),
	Action: func(c *cli.Context) error {
		paramsLenValidation(c, 1, "user.admin.add.args")

		client := esetup(c, NonAdminValidation)
		username := c.Args()[0]

		user := client.User().Get(username)
		user.Admin = true
		client.User().Update(user)

		color.Green("Admin privileges assigned to user " + username)
		return nil
	},
}

AddAdminUser :

View Source
var AddEntityToNotification = cli.Command{
	Name:        "add",
	Usage:       h.T("notification.service.add.usage"),
	ArgsUsage:   h.T("notification.service.add.args"),
	Description: h.T("notification.service.add.description"),
	Action: func(c *cli.Context) error {
		paramsLenValidation(c, 2, "notification.service.add.args")

		notification := c.Args()[0]
		project := c.Args()[1]
		client := esetup(c, AuthUsersValidation)
		entity := project
		if len(c.Args()) > 2 {
			entity = entity + "/" + c.Args()[2]
			client.Notification().AddEnv(notification, project, c.Args()[2])
		} else {
			client.Notification().AddProject(notification, project)
		}

		color.Green(fmt.Sprintf(h.T("notification.service.add.success"), entity, notification))
		return nil
	},
}

AddEntityToNotification : Creates a new user

View Source
var AdminUser = cli.Command{
	Name:  "admin",
	Usage: h.T("user.admin.usage"),
	Subcommands: []cli.Command{
		AddAdminUser,
		RmAdminUser,
	},
}

AdminUser ...

View Source
var AllProviderFlags = append(AWSVCloudFlags, ProviderAzureFlags...)

AllProviderFlags : All provider flags

View Source
var ApplyEnv = cli.Command{
	Name:        "apply",
	Aliases:     []string{"a"},
	Usage:       h.T("envs.apply.usage"),
	ArgsUsage:   h.T("envs.apply.args"),
	Description: h.T("envs.apply.description"),
	Flags: append([]cli.Flag{
		tBoolFlag("envs.apply.flags.dry"),
		tBoolFlag("envs.apply.flags.verbose"),
		tStringFlagND("envs.apply.flags.credentials"),
	}, AllProviderFlags...),
	Action: func(c *cli.Context) error {
		paramsLenValidation(c, 1, "envs.apply.args")
		client := esetup(c, AuthUsersValidation)
		def := mapDefinition(c)

		if _, err := client.Cli().Environments.Get(def.Project, def.Name); err != nil {
			env := emodels.Environment{
				Name:        def.Name,
				Project:     def.Project,
				Credentials: ProviderFlagsToSlice(c),
				Options:     MapEnvOptions(c, nil),
			}
			client.Environment().Create(def.Project, &env)
		}
		payload, err := def.Save()
		if err != nil {
			h.PrintError("Could not finalize definition yaml")
		}
		if c.Bool("dry") == true {
			view.EnvDry(*client.Build().Dry(payload))
			return nil
		}
		if c.Bool("verbose") {
			client.Build().Verbose = true
		}

		build := client.Build().Create(payload)
		if build.Status == "submitted" {
			color.Green("Build has been succesfully submitted and is awaiting approval.")
			os.Exit(0)
		}

		h.Monitorize(client.Build().Stream(build.ID))
		view.PrintEnvInfo(
			client.Environment().Get(def.Project, def.Name),
			client.Build().Get(def.Project, def.Name, build.GetID()),
		)

		return nil
	},
}

ApplyEnv command Applies changes described on a YAML file to an env

View Source
var AttachPolicy = cli.Command{
	Name:        "attach",
	Usage:       h.T("policy.attach.usage"),
	ArgsUsage:   h.T("policy.attach.args"),
	Description: h.T("policy.attach.description"),
	Flags: []cli.Flag{
		tStringFlag("policy.attach.flags.name"),
		tStringFlag("policy.attach.flags.environment"),
	},
	Action: func(c *cli.Context) error {
		flags := parseTemplateFlags(c, map[string]flagDef{
			"policy-name": flagDef{typ: "string", req: true},
			"environment": flagDef{typ: "string", req: true},
		})
		client := esetup(c, AuthUsersValidation)
		env := flags["environment"].(string)
		parts := strings.Split(env, "/")
		if len(parts) != 2 {
			h.PrintError(h.T("policy.attach.errors.invalid_name"))
		}

		p := client.Policy().Get(flags["policy-name"].(string))
		_ = client.Environment().Get(parts[0], parts[1])
		for _, v := range p.Environments {
			if v == env {
				h.PrintError(h.T("policy.attach.errors.already_attached"))
			}
		}
		p.Environments = append(p.Environments, env)
		client.Policy().Update(p)

		color.Green(fmt.Sprintf(h.T("policy.attach.success"), p.Name, env))
		return nil
	},
}

AttachPolicy : Display an existing policy

View Source
var AuthUsersValidation = []string{NonEmptuTokenVal}

AuthUsersValidation ...

View Source
var CmdDocs = cli.Command{
	Name:        "docs",
	Usage:       h.T("docs.usage"),
	ArgsUsage:   h.T("docs.args"),
	Description: h.T("docs.description"),
	Action: func(c *cli.Context) error {
		err := open.Run(docURL)
		if err != nil {
			fmt.Println(h.T("azure.create.success"), docURL)
		}
		return nil
	},
}

CmdDocs : Open docs in the default browser

View Source
var CmdEnv = cli.Command{
	Name:    "environment",
	Aliases: []string{"env"},
	Usage:   "Environment related subcommands",
	Subcommands: []cli.Command{
		ListEnvs,
		CreateEnv,
		UpdateEnv,
		ApplyEnv,
		DestroyEnv,
		HistoryEnv,
		ResetEnv,
		RevertEnv,
		DefinitionEnv,
		InfoEnv,
		MonitorEnv,
		DiffEnv,
		ImportEnv,
		SyncEnv,
		ResolveEnv,
		ReviewEnv,
		ScheduleEnv,
		ValidateEnv,
	},
}

CmdEnv ...

View Source
var CmdLog = cli.Command{
	Name:        "log",
	Usage:       h.T("log.usage"),
	ArgsUsage:   h.T("log.args"),
	Description: h.T("log.description"),
	Flags: []cli.Flag{
		tBoolFlag("log.flags.raw"),
	},
	Action: func(c *cli.Context) error {
		client := esetup(c, AuthUsersValidation)

		if c.Bool("raw") {
			_ = helper.PrintRawLogs(client.Logger().Stream())
		} else {
			_ = helper.PrintLogs(client.Logger().Stream())
		}

		runtime.Goexit()

		return nil
	},
}

CmdLog : Preferences setup

View Source
var CmdNotification = cli.Command{
	Name:  "notification",
	Usage: "Notification related subcommands",
	Subcommands: []cli.Command{
		ListNotifications,
		CreateNotification,
		UpdateNotification,
		DeleteNotification,
		AddEntityToNotification,
		RmEntityToNotification,
	},
}

CmdNotification ...

View Source
var CmdPolicy = cli.Command{
	Name:    "policy",
	Aliases: []string{"p"},
	Usage:   "Policy related subcommands",
	Subcommands: []cli.Command{
		ListPolicies,
		CreatePolicy,
		UpdatePolicy,
		DeletePolicy,
		ShowPolicy,
		HistoryPolicy,
		AttachPolicy,
		DetachPolicy,
	},
}

CmdPolicy ...

View Source
var CmdPreferences = cli.Command{
	Name:  "preferences",
	Usage: "Ernest preferences",
	Subcommands: []cli.Command{
		LoggerCommands,
	},
}

CmdPreferences : Preferences setup

View Source
var CmdProject = cli.Command{
	Name:  "project",
	Usage: "Project related subcommands",
	Subcommands: []cli.Command{
		ListProjects,
		CreateProjects,
		UpdateProjects,
		DeleteProject,
		InfoProject,
	},
}

CmdProject ...

View Source
var CmdRoles = cli.Command{
	Name:  "role",
	Usage: "Roles to manage resources authorization",
	Subcommands: []cli.Command{
		CmdRolesSet,
		CmdRolesUnset,
	},
}

CmdRoles ...

View Source
var CmdRolesSet = cli.Command{
	Name:        "set",
	Usage:       h.T("roles.set.usage"),
	ArgsUsage:   h.T("roles.set.args"),
	Description: h.T("roles.set.description"),
	Flags: []cli.Flag{
		tStringFlag("roles.set.flags.user"),
		tStringFlag("roles.set.flags.project"),
		tStringFlag("roles.set.flags.role"),
		tStringFlag("roles.set.flags.environment"),
		tStringFlag("roles.set.flags.policy"),
	},
	Action: func(c *cli.Context) error {
		rolesManager(c, true)
		return nil
	},
}

CmdRolesSet :

View Source
var CmdRolesUnset = cli.Command{
	Name:        "unset",
	Usage:       h.T("roles.unset.usage"),
	ArgsUsage:   h.T("roles.unset.args"),
	Description: h.T("roles.unset.description"),
	Flags: []cli.Flag{
		tStringFlag("roles.set.flags.user"),
		tStringFlag("roles.set.flags.project"),
		tStringFlag("roles.set.flags.role"),
		tStringFlag("roles.set.flags.environment"),
		tStringFlag("roles.set.flags.policy"),
	},
	Action: func(c *cli.Context) error {
		rolesManager(c, false)
		return nil
	},
}

CmdRolesUnset :

View Source
var CmdUsage = cli.Command{
	Name:        "usage",
	Usage:       h.T("usage.usage"),
	ArgsUsage:   h.T("usage.args"),
	Description: h.T("usage.description"),
	Flags: []cli.Flag{
		tStringFlagND("usage.flags.from"),
		tStringFlagND("usage.flags.to"),
		tStringFlagND("usage.flags.output"),
	},
	Action: func(c *cli.Context) error {
		client := esetup(c, AuthUsersValidation)
		body := client.Report().Usage(c.String("from"), c.String("to"))

		if c.String("output") != "" {
			if err := ioutil.WriteFile(c.String("output"), body, 0644); err != nil {
				h.PrintError(err.Error())
			}
			color.Green(fmt.Sprintf(h.T("usage.success"), c.String("output")))
		} else {
			fmt.Println(string(body))
		}

		return nil
	},
}

CmdUsage : Exports an usage report to a file on the current folder

View Source
var CmdUser = cli.Command{
	Name:  "user",
	Usage: h.T("user.usage"),
	Subcommands: []cli.Command{
		CreateUser,
		DisableUser,
		DisableMFA,
		EnableMFA,
		InfoUser,
		ListUsers,
		PasswordUser,
		ResetMFA,
		AdminUser,
	},
}

CmdUser ...

View Source
var CreateAWSProject = cli.Command{
	Name:        "aws",
	Usage:       h.T("aws.create.usage"),
	Description: h.T("aws.create.description"),
	ArgsUsage:   h.T("aws.create.args"),
	Flags: []cli.Flag{
		tStringFlag("aws.create.flags.region"),
		tStringFlag("aws.create.flags.access_key_id"),
		tStringFlag("aws.create.flags.secret_access_key"),
		tStringFlag("aws.create.flags.template"),
		tBoolFlag("aws.create.flags.fake"),
	},
	Action: func(c *cli.Context) error {
		paramsLenValidation(c, 1, "aws.create.args")
		client := esetup(c, AuthUsersValidation)
		creds := parseTemplateFlags(c, map[string]flagDef{
			"secret_access_key": flagDef{typ: "string", mapto: "aws_secret_access_key", req: true},
			"access_key_id":     flagDef{typ: "string", mapto: "aws_access_key_id", req: true},
			"region":            flagDef{typ: "string", req: true},
			"fake":              flagDef{typ: "bool", def: false},
		})
		creds["username"] = c.Args()[0]

		rtype := "aws"
		if creds["fake"].(bool) {
			rtype = "aws-fake"
		}

		p := &emodels.Project{
			Name:        c.Args()[0],
			Type:        rtype,
			Credentials: creds,
		}
		client.Project().Create(p)
		color.Green(fmt.Sprintf(h.T("aws.create.success"), p.Name))

		return nil
	},
}

CreateAWSProject : Creates an AWS project

View Source
var CreateAzureProject = cli.Command{
	Name:        "azure",
	Usage:       h.T("azure.create.usage"),
	Description: h.T("azure.create.description"),
	ArgsUsage:   h.T("azure.create.args"),
	Flags: []cli.Flag{
		tStringFlag("azure.create.flags.subscription_id"),
		tStringFlag("azure.create.flags.client_id"),
		tStringFlag("azure.create.flags.client_secret"),
		tStringFlag("azure.create.flags.tenant_id"),
		tStringFlag("azure.create.flags.environment"),
		tBoolFlag("azure.create.flags.fake"),
	},
	Action: func(c *cli.Context) error {
		paramsLenValidation(c, 1, "azure.create.args")
		client := esetup(c, AuthUsersValidation)
		creds := parseTemplateFlags(c, map[string]flagDef{
			"subscription_id": flagDef{typ: "string", mapto: "azure_subscription_id", req: true},
			"client_id":       flagDef{typ: "string", mapto: "azure_client_id", req: true},
			"client_secret":   flagDef{typ: "string", mapto: "azure_client_secret", req: true},
			"tenant_id":       flagDef{typ: "string", mapto: "azure_tenant_id", req: true},
			"environment":     flagDef{typ: "string", mapto: "azure_environment", def: "default", req: true},
			"fake":            flagDef{typ: "bool", def: false},
		})
		rtype := "azure"
		if creds["fake"].(bool) {
			rtype = "azure-fake"
		}

		p := &emodels.Project{
			Name:        c.Args()[0],
			Type:        rtype,
			Credentials: creds,
		}
		client.Project().Create(p)
		color.Green(fmt.Sprintf(h.T("azure.create.success"), p.Name))

		return nil
	},
}

CreateAzureProject : Creates an AWS project

View Source
var CreateEnv = cli.Command{
	Name:        "create",
	Aliases:     []string{"a"},
	Usage:       h.T("envs.create.usage"),
	ArgsUsage:   h.T("envs.create.args"),
	Description: h.T("envs.create.description"),
	Flags: append([]cli.Flag{
		tStringFlagND("envs.create.flags.credentials"),
		tStringFlagND("envs.create.flags.submissions"),
	}, AllProviderFlags...),
	Action: func(c *cli.Context) error {
		paramsLenValidation(c, 2, "envs.create.args")
		client := esetup(c, AuthUsersValidation)

		env := emodels.Environment{
			Name:        c.Args()[1],
			Project:     c.Args()[0],
			Credentials: ProviderFlagsToSlice(c),
			Options:     MapEnvOptions(c, nil),
		}
		client.Environment().Create(c.Args()[0], &env)
		color.Green("Environment successfully created")

		return nil
	},
}

CreateEnv : Creates an empty environment based on a name and a project name

View Source
var CreateNotification = cli.Command{
	Name:        "create",
	Usage:       h.T("notification.create.usage"),
	ArgsUsage:   h.T("notification.create.args"),
	Description: h.T("notification.create.description"),
	Action: func(c *cli.Context) error {
		paramsLenValidation(c, 3, "notification.create.args")
		client := esetup(c, AuthUsersValidation)

		name := c.Args()[0]
		notificationType := c.Args()[1]
		notificationConfig := c.Args()[2]
		notification := emodels.Notification{
			Name:   name,
			Type:   notificationType,
			Config: notificationConfig,
		}
		client.Notification().Create(&notification)
		color.Green(fmt.Sprintf(h.T("notification.create.success"), name))
		return nil
	},
}

CreateNotification : Creates a new user

View Source
var CreatePolicy = cli.Command{
	Name:        "create",
	Usage:       h.T("policy.create.usage"),
	ArgsUsage:   h.T("policy.create.args"),
	Description: h.T("policy.create.description"),
	Flags: []cli.Flag{
		tStringFlag("policy.create.flags.name"),
		tStringFlag("policy.create.flags.spec"),
	},
	Action: func(c *cli.Context) error {
		flags := parseTemplateFlags(c, map[string]flagDef{
			"policy-name": flagDef{typ: "string", req: true},
			"spec":        flagDef{typ: "string", req: true},
		})
		client := esetup(c, AuthUsersValidation)
		spec, err := ioutil.ReadFile(flags["spec"].(string))
		if err != nil {
			h.PrintError(h.T("policy.create.errors.spec"))
		}

		policy := emodels.Policy{
			Name: flags["policy-name"].(string),
		}
		client.Policy().Create(&policy)
		client.Policy().CreateDocument(policy.Name, string(spec))
		color.Green(fmt.Sprintf(h.T("policy.create.success"), policy.Name))
		return nil
	},
}

CreatePolicy : Creates a new user

View Source
var CreateProjects = cli.Command{
	Name:        "create",
	Usage:       "Create a new project.",
	Description: "Create a new project on the targeted instance of Ernest.",
	Subcommands: []cli.Command{
		CreateVcloudProject,
		CreateAWSProject,
		CreateAzureProject,
	},
}

CreateProjects ...

View Source
var CreateUser = cli.Command{
	Name:        "create",
	Usage:       h.T("user.create.usage"),
	ArgsUsage:   h.T("user.create.args"),
	Description: h.T("user.create.description"),
	Flags: []cli.Flag{
		tStringFlag("user.create.flags.email"),
		tBoolFlag("user.create.flags.mfa"),
		tBoolFlag("user.create.flags.admin"),
	},
	Action: func(c *cli.Context) error {
		paramsLenValidation(c, 2, "user.create.args")
		client := esetup(c, AuthUsersValidation)
		usr := c.Args()[0]
		mfa := c.Bool("mfa")

		user := &emodels.User{
			Username: usr,
			Email:    c.String("email"),
			Password: c.Args()[1],
			MFA:      &mfa,
			Disabled: h.Bool(false),
		}
		client.User().Create(user)
		color.Green("User %s successfully created\n\n", usr)

		if mfa {
			color.Green("MFA enabled")
			fmt.Printf("Account name: Ernest (%s)\nKey: %s\n", usr, user.MFASecret)
		}

		if c.Bool("admin") {
			client.User().Promote(user)
		}

		return nil
	},
}

CreateUser : Creates a new user

View Source
var CreateVcloudProject = cli.Command{
	Name:        "vcloud",
	Usage:       h.T("vcloud.create.usage"),
	ArgsUsage:   h.T("vcloud.create.args"),
	Description: h.T("vcloud.create.description"),
	Flags: []cli.Flag{
		tStringFlag("vcloud.create.flags.user"),
		tStringFlag("vcloud.create.flags.password"),
		tStringFlag("vcloud.create.flags.org"),
		tStringFlag("vcloud.create.flags.vdc"),
		tStringFlag("vcloud.create.flags.vcloud-url"),
		tStringFlag("vcloud.create.flags.template"),
		tBoolFlag("vcloud.create.flags.fake"),
	},
	Action: func(c *cli.Context) error {
		paramsLenValidation(c, 1, "vcloud.create.args")
		client := esetup(c, AuthUsersValidation)
		creds := parseTemplateFlags(c, map[string]flagDef{
			"vcloud-url": flagDef{typ: "string", mapto: "vcloud_url", req: true},
			"user":       flagDef{typ: "string", req: true},
			"org":        flagDef{typ: "string", req: true},
			"vdc":        flagDef{typ: "string", req: true},
			"password":   flagDef{typ: "string", req: true},
			"fake":       flagDef{typ: "bool", def: false},
		})
		creds["username"] = creds["user"].(string) + "@" + creds["org"].(string)

		rtype := "vcloud"
		if creds["fake"].(bool) {
			rtype = "vcloud-fake"
		}

		p := &emodels.Project{
			Name:        c.Args()[0],
			Type:        rtype,
			Credentials: creds,
		}
		client.Project().Create(p)
		color.Green(fmt.Sprintf(h.T("vcloud.create.success"), p.Name))

		return nil
	},
}

CreateVcloudProject : Creates a VCloud Project

View Source
var DefinitionEnv = cli.Command{
	Name:        "definition",
	Aliases:     []string{"s"},
	Usage:       h.T("envs.definition.usage"),
	ArgsUsage:   h.T("envs.definition.args"),
	Description: h.T("envs.definition.description"),
	Flags: []cli.Flag{
		tStringFlag("envs.definition.flags.build"),
	},
	Action: func(c *cli.Context) error {
		paramsLenValidation(c, 2, "envs.definition.args")
		flags := parseTemplateFlags(c, map[string]flagDef{
			"build": flagDef{typ: "string"},
		})
		client := esetup(c, AuthUsersValidation)

		builds := client.Build().List(c.Args()[0], c.Args()[1])
		build := getBuildByPosition(flags["build"], builds)
		def := client.Build().Definition(c.Args()[0], c.Args()[1], build.ID)

		fmt.Println(def)

		return nil
	},
}

DefinitionEnv command Shows the current definition of an environment by its name

View Source
var DelLogger = cli.Command{
	Name:        "delete",
	Usage:       h.T("logger.del.usage"),
	ArgsUsage:   h.T("logger.del.args"),
	Description: h.T("logger.del.description"),
	Action: func(c *cli.Context) error {
		paramsLenValidation(c, 1, "logger.del.args")
		client := esetup(c, NonAdminValidation)

		client.Logger().Delete(c.Args()[0])
		color.Green(h.T("logger.del.success"))

		return nil
	},
}

DelLogger : deletes a looger based on it type

View Source
var DeleteNotification = cli.Command{
	Name:        "delete",
	Usage:       h.T("notification.delete.usage"),
	ArgsUsage:   h.T("notification.delete.args"),
	Description: h.T("notification.delete.description"),
	Action: func(c *cli.Context) error {
		paramsLenValidation(c, 1, "notification.delete.args")
		name := c.Args()[0]
		client := esetup(c, AuthUsersValidation)

		client.Notification().Delete(name)
		color.Green(fmt.Sprintf(h.T("notification.delete.success"), name))
		return nil
	},
}

DeleteNotification : Will delete the specified notification

View Source
var DeletePolicy = cli.Command{
	Name:        "delete",
	Usage:       h.T("policy.delete.usage"),
	ArgsUsage:   h.T("policy.delete.args"),
	Description: h.T("policy.delete.description"),
	Flags: []cli.Flag{
		tStringFlag("policy.delete.flags.name"),
	},
	Action: func(c *cli.Context) error {
		flags := parseTemplateFlags(c, map[string]flagDef{
			"policy-name": flagDef{typ: "string", req: true},
		})

		client := esetup(c, AuthUsersValidation)
		name := flags["policy-name"].(string)

		client.Policy().Delete(name)
		color.Green(fmt.Sprintf(h.T("policy.delete.success"), name))
		return nil
	},
}

DeletePolicy : Will delete the specified policy

View Source
var DeleteProject = cli.Command{
	Name:        "delete",
	Usage:       h.T("vcloud.delete.usage"),
	ArgsUsage:   h.T("vcloud.delete.args"),
	Description: h.T("vcloud.delete.description"),
	Action: func(c *cli.Context) error {
		paramsLenValidation(c, 1, "vcloud.delete.args")
		client := esetup(c, AuthUsersValidation)

		name := c.Args()[0]
		client.Project().Delete(name)
		color.Green(fmt.Sprintf(h.T("vcloud.delete.success"), name))

		return nil
	},
}

DeleteProject : Project deletion command definition

View Source
var DestroyEnv = cli.Command{
	Name:        "delete",
	Aliases:     []string{"destroy", "d"},
	Usage:       h.T("envs.destroy.usage"),
	ArgsUsage:   h.T("envs.destroy.args"),
	Description: h.T("envs.destroy.description"),
	Flags: []cli.Flag{
		tBoolFlag("envs.destroy.flags.force"),
		tBoolFlag("envs.destroy.flags.yesflag"),
	},
	Action: func(c *cli.Context) error {
		paramsLenValidation(c, 2, "envs.destroy.args")
		client := esetup(c, AuthUsersValidation)

		if c.Bool("force") {
			client.Environment().ForceDeletion(c.Args()[0], c.Args()[1])
		} else {
			if c.Bool("yes") == false {
				fmt.Print(h.T("envs.destroy.confirmation"))
				if askForConfirmation() == false {
					return nil
				}
			}
			build := client.Environment().Delete(c.Args()[0], c.Args()[1])
			h.Monitorize(client.Build().Stream(build.ID))
		}
		color.Green(h.T("envs.destroy.success"))
		return nil
	},
}

DestroyEnv command

View Source
var DetachPolicy = cli.Command{
	Name:        "detach",
	Usage:       h.T("policy.detach.usage"),
	ArgsUsage:   h.T("policy.detach.args"),
	Description: h.T("policy.detach.description"),
	Flags: []cli.Flag{
		tStringFlag("policy.detach.flags.name"),
		tStringFlag("policy.detach.flags.environment"),
	},
	Action: func(c *cli.Context) error {
		flags := parseTemplateFlags(c, map[string]flagDef{
			"policy-name": flagDef{typ: "string", req: true},
			"environment": flagDef{typ: "string", req: true},
		})
		client := esetup(c, AuthUsersValidation)
		env := flags["environment"].(string)
		parts := strings.Split(env, "/")
		if len(parts) != 2 {
			h.PrintError(h.T("policy.detach.errors.invalid_name"))
		}

		p := client.Policy().Get(flags["policy-name"].(string))
		_ = client.Environment().Get(parts[0], parts[1])
		var toBeAttached []string
		for _, v := range p.Environments {
			if v != env {
				toBeAttached = append(toBeAttached, v)
			}
		}
		if len(toBeAttached) == len(p.Environments) {
			h.T("policy.detach.error.not_attached")
		}
		p.Environments = toBeAttached
		client.Policy().Update(p)

		color.Green(fmt.Sprintf(h.T("policy.detach.success"), p.Name, env))
		return nil
	},
}

DetachPolicy : Display an existing policy

View Source
var DiffEnv = cli.Command{
	Name:        "diff",
	Aliases:     []string{"i"},
	Usage:       h.T("envs.diff.usage"),
	ArgsUsage:   h.T("envs.diff.args"),
	Description: h.T("envs.diff.description"),
	Action: func(c *cli.Context) error {
		paramsLenValidation(c, 4, "envs.diff.args")
		client := esetup(c, AuthUsersValidation)

		build1 := client.Build().BuildByPosition(c.Args()[0], c.Args()[1], c.Args()[2])
		build2 := client.Build().BuildByPosition(c.Args()[0], c.Args()[1], c.Args()[3])
		changelog := client.Build().Diff(c.Args()[0], c.Args()[1], build1.GetID(), build2.GetID())

		view.PrintDiff(changelog)

		return nil
	},
}

DiffEnv : Shows detailed information of an env by its name

View Source
var DisableMFA = cli.Command{
	Name:        "disable-mfa",
	Usage:       h.T("user.disable-mfa.usage"),
	Description: h.T("user.disable-mfa.description"),
	Flags: []cli.Flag{
		tStringFlagND("user.disable-mfa.flags.user"),
	},
	Action: func(c *cli.Context) error {
		client := esetup(c, NonAdminValidation)
		session := client.Session().Get()
		username := stringWithDefault(c, "user-name", session.Username)

		user := client.User().Get(username)
		if user.MFA == nil || !*user.MFA {
			fmt.Println("MFA already disabled")
			return nil
		}

		_ = client.User().ToggleMFA(user, false)
		color.Red("MFA disabled")

		return nil
	},
}

DisableMFA turns off Multi-Factor authentication

View Source
var DisableUser = cli.Command{
	Name:        "disable",
	Usage:       h.T("user.disable.usage"),
	ArgsUsage:   h.T("user.disable.args"),
	Description: h.T("user.disable.description"),
	Action: func(c *cli.Context) error {
		paramsLenValidation(c, 1, "user.disable.args")
		client := esetup(c, NonAdminValidation)
		username := c.Args()[0]

		user := client.User().Get(username)
		user.Password = randString(16)
		user.Disabled = h.Bool(true)
		client.User().Update(user)

		color.Green("Account `" + username + "` has been disabled")
		return nil
	},
}

DisableUser : Will disable a user (change its password)

View Source
var EnableMFA = cli.Command{
	Name:        "enable-mfa",
	Usage:       h.T("user.enable-mfa.usage"),
	Description: h.T("user.enable-mfa.description"),
	Flags: []cli.Flag{
		tStringFlagND("user.enable-mfa.flags.user"),
	},
	Action: func(c *cli.Context) error {
		client := esetup(c, NonAdminValidation)
		session := client.Session().Get()
		username := stringWithDefault(c, "user-name", session.Username)

		user := client.User().Get(username)
		if user.MFA != nil && *user.MFA {
			fmt.Println("MFA already enabled")
			return nil
		}

		secret := client.User().ToggleMFA(user, true)
		color.Green("MFA enabled")
		fmt.Printf("Account name: Ernest (%s)\nKey: %s\n", user.Username, secret)

		return nil
	},
}

EnableMFA turns on Multi-Factor authentication

View Source
var EnvAddSchedule = cli.Command{
	Name:        "add",
	Aliases:     []string{"a"},
	Usage:       h.T("envs.schedule.add.usage"),
	ArgsUsage:   h.T("envs.schedule.add.args"),
	Description: h.T("envs.schedule.add.description"),
	Flags: []cli.Flag{
		tStringFlagND("envs.schedule.add.flags.action"),
		tStringFlagND("envs.schedule.add.flags.resolution"),
		tStringFlagND("envs.schedule.add.flags.instances"),
		tStringFlagND("envs.schedule.add.flags.schedule"),
	},
	Action: func(c *cli.Context) error {
		paramsLenValidation(c, 3, "envs.schedule.list.args")
		client := esetup(c, AuthUsersValidation)

		env := client.Environment().Get(c.Args()[0], c.Args()[1])

		schedule := make(map[string]interface{}, 0)
		schedule["name"] = c.Args()[2]
		schedule["type"] = c.String("action")
		schedule["interval"] = c.String("schedule")

		switch c.String("action") {
		case "sync":
			resolution := c.String("resolution")
			if resolution == "" {
				resolution = "manual"
			}
			schedule["resolution"] = resolution
		case "power_on", "power_off":
			schedule["instances"] = strings.Split(c.String("instances"), ",")
		default:
			h.PrintError("unsupported action type: " + c.String("action"))
		}

		if env.Schedules == nil {
			env.Schedules = make(map[string]interface{}, 0)
		}

		env.Schedules[c.Args()[2]] = schedule
		client.Environment().Update(env)
		color.Green(h.T("envs.schedule.add.success"))

		return nil
	},
}

EnvAddSchedule : Appends a new schedule to a given environment

View Source
var EnvListSchedules = cli.Command{
	Name:        "list",
	Aliases:     []string{"a"},
	Usage:       h.T("envs.schedule.list.usage"),
	ArgsUsage:   h.T("envs.schedule.list.args"),
	Description: h.T("envs.schedule.list.description"),
	Action: func(c *cli.Context) error {
		paramsLenValidation(c, 2, "envs.schedule.list.args")
		client := esetup(c, AuthUsersValidation)

		env := client.Environment().Get(c.Args()[0], c.Args()[1])
		list := env.Schedules

		view.PrintScheduleList(list)
		return nil
	},
}

EnvListSchedules : Gets a list of env schedules

View Source
var EnvRmSchedule = cli.Command{
	Name:        "delete",
	Aliases:     []string{"a"},
	Usage:       h.T("envs.schedule.rm.usage"),
	ArgsUsage:   h.T("envs.schedule.rm.args"),
	Description: h.T("envs.schedule.rm.description"),
	Action: func(c *cli.Context) error {
		paramsLenValidation(c, 2, "envs.schedule.list.args")
		client := esetup(c, AuthUsersValidation)

		env := client.Environment().Get(c.Args()[0], c.Args()[1])
		delete(env.Schedules, c.Args()[2])

		client.Environment().Update(env)
		color.Green(h.T("envs.schedule.rm.success"))

		return nil
	},
}

EnvRmSchedule : Appends a new schedule to a given environment

View Source
var HistoryEnv = cli.Command{
	Name:        "history",
	Usage:       h.T("envs.history.usage"),
	ArgsUsage:   h.T("envs.history.args"),
	Description: h.T("envs.history.description"),
	Action: func(c *cli.Context) error {
		paramsLenValidation(c, 2, "envs.history.args")
		client := esetup(c, AuthUsersValidation)
		envs := client.Build().List(c.Args()[0], c.Args()[1])
		view.PrintEnvHistory(c.Args()[1], envs)
		return nil
	},
}

HistoryEnv command Shows the history of an env, a list of builds

View Source
var HistoryPolicy = cli.Command{
	Name:        "history",
	Usage:       h.T("policy.history.usage"),
	ArgsUsage:   h.T("policy.history.args"),
	Description: h.T("policy.history.description"),
	Flags: []cli.Flag{
		tStringFlag("policy.history.flags.name"),
	},
	Action: func(c *cli.Context) error {
		flags := parseTemplateFlags(c, map[string]flagDef{
			"policy-name": flagDef{typ: "string", req: true},
		})
		client := esetup(c, AuthUsersValidation)

		documents := client.Policy().ListDocuments(flags["policy-name"].(string))
		view.PrintPolicyHistory(documents)

		return nil
	},
}

HistoryPolicy : Display a policys revisions

View Source
var ImportEnv = cli.Command{
	Name:        "import",
	Aliases:     []string{"i"},
	Usage:       h.T("envs.import.usage"),
	ArgsUsage:   h.T("envs.import.args"),
	Description: h.T("envs.import.description"),
	Flags: []cli.Flag{
		tStringFlag("envs.import.flags.project"),
		tStringFlag("envs.import.flags.filters"),
	},
	Action: func(c *cli.Context) error {
		paramsLenValidation(c, 2, "envs.import.args")
		client := esetup(c, AuthUsersValidation)

		var filters []string
		if c.String("filters") != "" {
			filters = strings.Split(c.String("filters"), ",")
		}

		env := emodels.Environment{
			Name:    c.Args()[1],
			Project: c.Args()[0],
		}
		client.Environment().Create(c.Args()[0], &env)
		a := client.Environment().Import(c.Args()[0], c.Args()[1], filters)
		h.Monitorize(client.Build().Stream(a.ResourceID))

		return nil
	},
}

ImportEnv : Shows detailed information of an env by its name

View Source
var Info = cli.Command{
	Name:        "info",
	Aliases:     []string{"i"},
	Usage:       h.T("info.usage"),
	ArgsUsage:   h.T("info.args"),
	Description: h.T("info.description"),
	Action: func(c *cli.Context) error {
		client := esetup(c, NoValidation)
		fmt.Println("Target:      " + client.Config().URL)
		fmt.Println("User:        " + client.Config().User)
		fmt.Println("CLI Version: " + c.App.Version)

		return nil
	},
}

Info command Shows the current ernest target instance information

View Source
var InfoEnv = cli.Command{
	Name:        "info",
	Aliases:     []string{"i"},
	Usage:       h.T("envs.info.usage"),
	ArgsUsage:   h.T("envs.info.args"),
	Description: h.T("envs.info.description"),
	Flags: []cli.Flag{
		tStringFlag("envs.info.flags.build"),
	},
	Action: func(c *cli.Context) error {
		paramsLenValidation(c, 2, "envs.info.args")
		client := esetup(c, AuthUsersValidation)

		build := client.Build().BuildByPosition(c.Args()[0], c.Args()[1], c.String("build"))
		build = client.Build().Get(c.Args()[0], c.Args()[1], build.ID)
		env := client.Environment().Get(c.Args()[0], c.Args()[1])
		view.PrintEnvInfo(env, build)

		return nil
	},
}

InfoEnv : Shows detailed information of a env by its name

View Source
var InfoProject = cli.Command{
	Name:        "info",
	Usage:       h.T("project.info.usage"),
	ArgsUsage:   h.T("project.info.args"),
	Description: h.T("project.info.description"),
	Action: func(c *cli.Context) error {
		paramsLenValidation(c, 1, "project.info.args")
		client := esetup(c, AuthUsersValidation)
		p := client.Project().Get(c.Args()[0])
		view.PrintProjectInfo(p)

		return nil
	},
}

InfoProject ...

View Source
var InfoUser = cli.Command{
	Name:        "info",
	Usage:       h.T("user.info.usage"),
	Description: h.T("user.info.description"),
	Flags: []cli.Flag{
		tStringFlag("user.info.flags.user"),
	},
	Action: func(c *cli.Context) error {
		client := esetup(c, NonAdminValidation)
		username := stringWithDefault(c, "user", client.Config().User)

		user := client.User().Get(username)
		view.PrintUserInfo(user)
		return nil
	},
}

InfoUser :

View Source
var ListEnvs = cli.Command{
	Name:        "list",
	Usage:       h.T("envs.list.usage"),
	ArgsUsage:   h.T("envs.list.args"),
	Description: h.T("envs.list.description"),
	Action: func(c *cli.Context) error {
		client := esetup(c, AuthUsersValidation)
		envs := client.Environment().ListAll()
		view.PrintEnvList(envs)

		return nil
	},
}

ListEnvs ...

View Source
var ListLoggers = cli.Command{
	Name:        "list",
	Usage:       h.T("logger.list.usage"),
	ArgsUsage:   h.T("logger.list.args"),
	Description: h.T("logger.list.description"),
	Action: func(c *cli.Context) error {
		client := esetup(c, NonAdminValidation)

		loggers := client.Logger().List()
		view.PrintLoggerList(loggers)

		return nil
	},
}

ListLoggers : Lists all loggers confured on ernest

View Source
var ListNotifications = cli.Command{
	Name:        "list",
	Usage:       h.T("notification.list.usage"),
	ArgsUsage:   h.T("notification.list.args"),
	Description: h.T("notification.list.description"),
	Action: func(c *cli.Context) error {
		client := esetup(c, AuthUsersValidation)
		notifications := client.Notification().List()

		view.PrintNotificationList(notifications)

		return nil
	},
}

ListNotifications ...

View Source
var ListPolicies = cli.Command{
	Name:        "list",
	Usage:       h.T("policy.list.usage"),
	ArgsUsage:   h.T("policy.list.args"),
	Description: h.T("policy.list.description"),
	Action: func(c *cli.Context) error {
		client := esetup(c, AuthUsersValidation)
		policies := client.Policy().List()

		view.PrintPolicyList(policies)

		return nil
	},
}

ListPolicies ...

View Source
var ListProjects = cli.Command{
	Name:        "list",
	Usage:       h.T("project.list.usage"),
	ArgsUsage:   h.T("project.list.args"),
	Description: h.T("project.list.description"),
	Action: func(c *cli.Context) error {
		client := esetup(c, AuthUsersValidation)
		projects := client.Project().List()
		view.PrintProjectList(projects)

		return nil
	},
}

ListProjects ...

View Source
var ListUsers = cli.Command{
	Name:        "list",
	Usage:       h.T("user.list.usage"),
	ArgsUsage:   h.T("user.list.args"),
	Description: h.T("user.list.description"),
	Action: func(c *cli.Context) error {
		client := esetup(c, AuthUsersValidation)
		users := client.User().List()
		view.PrintUserList(users)

		return nil
	},
}

ListUsers : Gets a list of accessible users

View Source
var LoggerCommands = cli.Command{
	Name:        "logger",
	Usage:       "Setup logger preferences.",
	Description: "Setup ernest logger preferenres.",
	Subcommands: []cli.Command{
		ListLoggers,
		SetLogger,
		DelLogger,
	},
}

LoggerCommands : Logger related commands

View Source
var Login = cli.Command{
	Name:        "login",
	Aliases:     []string{"l"},
	Usage:       h.T("login.usage"),
	ArgsUsage:   h.T("login.args"),
	Description: h.T("login.description"),
	Flags: []cli.Flag{
		tStringFlag("login.flags.user"),
		tStringFlag("login.flags.password"),
		tStringFlag("login.flags.verification"),
	},
	Action: func(c *cli.Context) error {
		var username string
		var password string
		var verificationCode string

		if c.String("user") == "" {
			if os.Getenv("ERNEST_USER") != "" {
				username = os.Getenv("ERNEST_USER")
			} else {
				fmt.Printf("Username: ")
				_, err := fmt.Scanln(&username)
				if err != nil {
					fmt.Fprintf(os.Stderr, "ERROR: %v\n", err)
				}
			}
		} else {
			username = c.String("user")
		}

		if c.String("password") == "" {
			if os.Getenv("ERNEST_PASSWORD") != "" {
				password = os.Getenv("ERNEST_PASSWORD")
			} else {
				fmt.Printf("Password: ")
				if runtime.GOOS == "windows" {
					_, err := fmt.Scanln(&password)
					if err != nil {
						fmt.Fprintf(os.Stderr, "ERROR: %v\n", err)
					}
				} else {
					pass, _ := gopass.GetPasswdMasked()
					password = string(pass)
				}
			}
		} else {
			password = c.String("password")
		}

		verificationCode = c.String("verification-code")
		client := elogin(username, password, verificationCode)
		token, err := client.Cli().Authenticate()

		if err != nil && err.Error() == "mfa required" {
			fmt.Printf("Verification code: ")
			vc, _ := gopass.GetPasswdMasked()
			verificationCode = string(vc)

			client = elogin(username, password, verificationCode)
			token, err = client.Cli().Authenticate()
		}

		if err != nil {
			h.PrintError(err.Error())
		}

		cfg := client.Config()
		cfg.Token = token

		if err := model.SaveConfig(client.Config()); err != nil {
			h.PrintError("Can't write config file")
		}

		color.Green("Welcome back " + username)

		return nil
	},
}

Login command Login with your Ernest credentials

View Source
var Logout = cli.Command{
	Name:        "logout",
	Usage:       h.T("logout.usage"),
	ArgsUsage:   h.T("logout.args"),
	Description: h.T("logout.description"),
	Action: func(c *cli.Context) error {
		client := esetup(c, AuthUsersValidation)

		cfg := client.Config()
		cfg.Token = ""
		cfg.User = ""
		if err := model.SaveConfig(cfg); err != nil {
			h.PrintError(h.T("logout.errors.write"))
		}
		color.Green(h.T("logout.success"))
		return nil
	},
}

Logout command Clear local authentication credentials

View Source
var MonitorEnv = cli.Command{
	Name:        "monitor",
	Aliases:     []string{"m"},
	Usage:       h.T("monitor.usage"),
	ArgsUsage:   h.T("monitor.args"),
	Description: h.T("monitor.description"),
	Action: func(c *cli.Context) error {
		paramsLenValidation(c, 2, "monitor.args")
		client := esetup(c, AuthUsersValidation)

		build := client.Build().BuildByPosition(c.Args()[0], c.Args()[1], "")

		if build.Status == "done" {
			color.Yellow(h.T("monitor.success_1"))
			color.Yellow(fmt.Sprintf(h.T("monitor.success_2"), c.Args()[0], c.Args()[1]))
			return nil
		}
		return h.Monitorize(client.Build().Stream(build.ID))
	},
}

MonitorEnv command Monitorizes an environment and shows the actions being performed on it

View Source
var NoValidation = []string{}

NoValidation ...

View Source
var NonAdminValidation = []string{NonEmptuTokenVal, NonAdminVal}

NonAdminValidation ...

View Source
var PasswordUser = cli.Command{
	Name:        "change-password",
	Usage:       h.T("user.change_password.usage"),
	Description: h.T("user.change_password.description"),
	Flags: []cli.Flag{
		tStringFlag("user.change_password.flags.user"),
		tStringFlag("user.change_password.flags.password"),
		tStringFlag("user.change_password.flags.current-password"),
	},
	Action: func(c *cli.Context) error {
		client := esetup(c, AuthUsersValidation)
		session := client.Session().Get()

		username := c.String("user")
		password := c.String("password")
		currentPassword := c.String("current-password")

		if !session.IsAdmin() && username != "" {
			h.PrintError("You don’t have permissions to perform this action")
		}

		if session.IsAdmin() && username != "" {

			if password == "" {
				h.PrintError("Please provide a valid password for the user with `--password`")
			}
			user := client.User().Get(username)
			user.Password = password
			user.Disabled = h.Bool(false)
			client.User().Update(user)
			color.Green("`" + username + "` password has been changed")

		} else {

			users := client.User().List()
			if len(users) == 0 {
				h.PrintError("You don’t have permissions to perform this action")
			}

			oldpassword := currentPassword
			newpassword := password
			rnewpassword := password

			if oldpassword == "" || newpassword == "" {
				fmt.Printf("You're about to change your password, please respond the questions below: \n")
				fmt.Printf("Current password: ")
				opass, _ := gopass.GetPasswdMasked()
				oldpassword = string(opass)

				fmt.Printf("New password: ")
				npass, _ := gopass.GetPasswdMasked()
				newpassword = string(npass)

				fmt.Printf("Confirm new password: ")
				rnpass, _ := gopass.GetPasswdMasked()
				rnewpassword = string(rnpass)
			}

			if newpassword != rnewpassword {
				h.PrintError("Aborting... New password and confirmation doesn't match.")
			}

			username := client.Config().User
			user := client.User().Get(username)
			user.Password = newpassword
			user.OldPassword = oldpassword
			user.Disabled = h.Bool(false)
			client.User().Update(user)

			color.Green("Your password has been changed")
		}

		return nil
	},
}

PasswordUser : Allows users or admins to change its passwords

View Source
var ProviderAWSFlags = []cli.Flag{
	tStringFlag("aws.create.flags.region"),
	tStringFlag("aws.create.flags.access_key_id"),
	tStringFlag("aws.create.flags.secret_access_key"),
}

ProviderAWSFlags : ...

View Source
var ProviderAzureFlags = []cli.Flag{
	tStringFlag("azure.update.flags.subscription_id"),
	tStringFlag("azure.update.flags.client_id"),
	tStringFlag("azure.update.flags.client_secret"),
	tStringFlag("azure.update.flags.tenant_id"),
	tStringFlag("azure.update.flags.environment"),
}

ProviderAzureFlags : ...

View Source
var ProviderVCloudFlags = []cli.Flag{
	tStringFlag("vcloud.create.flags.user"),
	tStringFlag("vcloud.create.flags.password"),
	tStringFlag("vcloud.create.flags.org"),
	tStringFlag("vcloud.create.flags.vse-url"),
	tStringFlag("vcloud.create.flags.vcloud-url"),
	tStringFlag("vcloud.create.flags.public-network"),
	tStringFlag("vcloud.create.flags.vcloud-region"),
}

ProviderVCloudFlags : ..

View Source
var ResetEnv = cli.Command{
	Name:        "reset",
	Usage:       h.T("envs.reset.usage"),
	ArgsUsage:   h.T("envs.reset.args"),
	Description: h.T("envs.reset.description"),
	Action: func(c *cli.Context) error {
		paramsLenValidation(c, 2, "envs.reset.args")
		client := esetup(c, AuthUsersValidation)
		client.Environment().Reset(c.Args()[0], c.Args()[1])
		color.Red(fmt.Sprintf(h.T("envs.reset.success"), c.Args()[0], c.Args()[1]))
		return nil
	},
}

ResetEnv command

View Source
var ResetMFA = cli.Command{
	Name:        "reset-mfa",
	Usage:       h.T("user.reset-mfa.usage"),
	Description: h.T("user.reset-mfa.description"),
	Flags: []cli.Flag{
		tStringFlagND("user.reset-mfa.flags.user"),
	},
	Action: func(c *cli.Context) error {
		client := esetup(c, NonAdminValidation)
		session := client.Session().Get()
		username := stringWithDefault(c, "user-name", session.Username)
		user := client.User().Get(username)

		_ = client.User().ToggleMFA(user, false)
		secret := client.User().ToggleMFA(user, true)

		color.Green("MFA reset")
		fmt.Printf("Account name: Ernest (%s)\nKey: %s\n", user.Username, secret)

		return nil
	},
}

ResetMFA generates a new secret for Multi-Factor authentication

View Source
var ResolveEnv = cli.Command{
	Name:        "resolve",
	Aliases:     []string{"r"},
	Usage:       h.T("envs.resolve.usage"),
	ArgsUsage:   h.T("envs.resolve.args"),
	Description: h.T("envs.resolve.description"),
	Flags: append([]cli.Flag{
		tBoolFlag("envs.resolve.flags.accept"),
		tBoolFlag("envs.resolve.flags.reject"),
		tBoolFlag("envs.resolve.flags.ignore"),
	}),
	Action: func(c *cli.Context) error {
		paramsLenValidation(c, 2, "envs.resolve.args")
		client := esetup(c, AuthUsersValidation)

		project := c.Args()[0]
		env := c.Args()[1]

		var resolution string
		if c.Bool("accept") {
			resolution = "accept-changes"
		}
		if c.Bool("reject") {
			resolution = "reject-changes"
		}
		if c.Bool("ignore") {
			resolution = "ignore-changes"
		}

		if resolution == "" {
			builds := client.Build().List(project, env)

			b1 := buildIDFromIndex(builds, strconv.Itoa(len(builds)-1))
			b2 := buildIDFromIndex(builds, strconv.Itoa(len(builds)))

			changelog := client.Build().Diff(project, env, b1.ID, b2.ID)
			view.PrintDiff(changelog)
			fmt.Printf("\n\n")
			view.PrintValidation(b2.Validation)

			return nil
		}

		action := client.Environment().Resolve(c.Args()[0], c.Args()[1], resolution)
		if action.ResourceID != "" {
			h.Monitorize(client.Build().Stream(action.ResourceID))
		}

		return nil
	},
}

ResolveEnv command Resolves an issue that requires user input

View Source
var RevertEnv = cli.Command{
	Name:        "revert",
	Usage:       h.T("envs.revert.usage"),
	ArgsUsage:   h.T("envs.revert.args"),
	Description: h.T("envs.revert.description"),
	Flags: []cli.Flag{
		tBoolFlag("envs.revert.flags.dry"),
	},
	Action: func(c *cli.Context) error {
		paramsLenValidation(c, 3, "envs.revert.args")
		client := esetup(c, AuthUsersValidation)
		builds := client.Build().List(c.Args()[0], c.Args()[1])
		build := getBuildByPosition(c.Args()[2], builds)
		def := client.Build().Definition(c.Args()[0], c.Args()[1], build.ID)

		if c.Bool("dry") == true {
			view.EnvDry(*client.Build().Dry([]byte(def)))
		} else {
			build := client.Build().Create([]byte(def))
			if build.Status == "submitted" {
				color.Green(h.T("envs.revert.success"))
				os.Exit(0)
			}

			h.Monitorize(client.Build().Stream(build.ID))
		}

		return nil
	},
}

RevertEnv command

View Source
var ReviewEnv = cli.Command{
	Name:        "review",
	Aliases:     []string{"rev"},
	Usage:       h.T("envs.review.usage"),
	ArgsUsage:   h.T("envs.review.args"),
	Description: h.T("envs.review.description"),
	Flags: append([]cli.Flag{
		tBoolFlag("envs.review.flags.accept"),
		tBoolFlag("envs.review.flags.reject"),
	}),
	Action: func(c *cli.Context) error {
		paramsLenValidation(c, 2, "envs.review.args")
		client := esetup(c, AuthUsersValidation)

		project := c.Args()[0]
		env := c.Args()[1]

		var resolution string
		if c.Bool("accept") {
			resolution = "submission-accepted"
		}
		if c.Bool("reject") {
			resolution = "submission-rejected"
		}

		if resolution == "" {
			builds := client.Build().List(project, env)
			b2 := buildIDFromIndex(builds, strconv.Itoa(len(builds)))

			changelog := client.Build().Changelog(project, env, b2.ID)
			view.PrintDiff(changelog)

			return nil
		}

		action := client.Environment().Review(project, env, resolution)
		if action.ResourceID != "" {
			h.Monitorize(client.Build().Stream(action.ResourceID))
			view.PrintEnvInfo(
				client.Environment().Get(project, env),
				client.Build().Get(project, env, action.ResourceID),
			)
		}

		return nil
	},
}

ReviewEnv command Approval for outstanding build submissions

View Source
var RmAdminUser = cli.Command{
	Name:        "rm",
	Usage:       h.T("user.admin.rm.usage"),
	Description: h.T("user.admin.rm.description"),
	Action: func(c *cli.Context) error {
		paramsLenValidation(c, 1, "user.admin.rm.args")

		client := esetup(c, NonAdminValidation)
		username := c.Args()[0]

		user := client.User().Get(username)
		user.Admin = false
		client.User().Update(user)

		color.Green("Admin privileges revoked from user " + username)
		return nil
	},
}

RmAdminUser :

View Source
var RmEntityToNotification = cli.Command{
	Name:        "remove",
	Usage:       h.T("notification.service.rm.usage"),
	ArgsUsage:   h.T("notification.service.rm.args"),
	Description: h.T("notification.service.rm.description"),
	Action: func(c *cli.Context) error {
		paramsLenValidation(c, 2, "notification.service.rm.args")

		notification := c.Args()[0]
		project := c.Args()[1]
		client := esetup(c, AuthUsersValidation)
		entity := project
		if len(c.Args()) > 2 {
			entity = entity + "/" + c.Args()[2]
			client.Notification().RmEnv(notification, project, c.Args()[2])
		} else {
			client.Notification().RmProject(notification, project)
		}

		color.Green(fmt.Sprintf(h.T("notification.service.rm.success"), entity, notification))
		return nil
	},
}

RmEntityToNotification : Creates a new user

View Source
var ScheduleEnv = cli.Command{
	Name:    "schedule",
	Aliases: []string{"sch"},
	Usage:   "Scheduling environment related subcommands",
	Subcommands: []cli.Command{
		EnvListSchedules,
		EnvAddSchedule,
		EnvRmSchedule,
	},
}

ScheduleEnv ...

View Source
var SetLogger = cli.Command{
	Name:        "add",
	Usage:       h.T("logger.set.usage"),
	ArgsUsage:   h.T("logger.set.args"),
	Description: h.T("logger.set.description"),
	Flags: []cli.Flag{
		tStringFlag("logger.set.flags.logfile"),
		tStringFlag("logger.set.flags.token"),
		tStringFlag("logger.set.flags.env"),
		tStringFlag("logger.set.flags.hostname"),
		tIntFlag("logger.set.flags.port"),
		tIntFlag("logger.set.flags.timeout"),
	},
	Action: func(c *cli.Context) error {
		paramsLenValidation(c, 1, "logger.set.args")
		client := esetup(c, NonAdminValidation)

		logger := emodels.Logger{
			Type:        c.Args()[0],
			Logfile:     c.String("logfile"),
			Hostname:    c.String("hostname"),
			Port:        c.Int("port"),
			Timeout:     c.Int("timeout"),
			Token:       c.String("token"),
			Environment: c.String("env"),
		}
		if logger.Type == "basic" {
			if logger.Logfile == "" {
				h.PrintError(h.T("logger.set.errors.logfile"))
			}
		} else if logger.Type == "logstash" {
			if logger.Hostname == "" {
				h.PrintError(h.T("logger.set.errors.hostname"))
			}
			if logger.Port == 0 {
				h.PrintError(h.T("logger.set.errors.port"))
			}
			if logger.Timeout == 0 {
				h.PrintError(h.T("logger.set.errors.timeout"))
			}
		} else if logger.Type == "rollbar" {
			if logger.Token == "" {
				h.PrintError(h.T("logger.set.errors.token"))
			}
			if logger.Environment == "" {
				logger.Environment = "development"
			}
		} else {
			color.Red(h.T("logger.set.errors.type"))
			return nil
		}

		client.Logger().Create(&logger)
		color.Green(h.T("logger.set.success"))

		return nil
	},
}

SetLogger : Creates / updates a looger based on it type

View Source
var ShowPolicy = cli.Command{
	Name:        "show",
	Usage:       h.T("policy.show.usage"),
	ArgsUsage:   h.T("policy.show.args"),
	Description: h.T("policy.show.description"),
	Flags: []cli.Flag{
		tStringFlag("policy.show.flags.name"),
		tStringFlag("policy.show.flags.revision"),
	},
	Action: func(c *cli.Context) error {
		flags := parseTemplateFlags(c, map[string]flagDef{
			"policy-name": flagDef{typ: "string", req: true},
			"revision":    flagDef{typ: "string", req: true},
		})
		client := esetup(c, AuthUsersValidation)

		n := client.Policy().GetDocument(flags["policy-name"].(string), flags["revision"].(string))
		fmt.Println(n.Definition)
		return nil
	},
}

ShowPolicy : Display an existing policy

View Source
var SyncEnv = cli.Command{
	Name:        "sync",
	Aliases:     []string{"s"},
	Usage:       h.T("envs.sync.usage"),
	ArgsUsage:   h.T("envs.sync.args"),
	Description: h.T("envs.sync.description"),
	Action: func(c *cli.Context) error {
		paramsLenValidation(c, 2, "envs.sync.args")
		client := esetup(c, AuthUsersValidation)

		project := c.Args()[0]
		env := c.Args()[1]

		action := client.Environment().Sync(project, env)
		if action.ResourceID == "" {
			return nil
		}

		stream := client.Build().Stream(action.ResourceID)
		for {
			var m map[string]interface{}

			msg, ok := <-stream
			if !ok {
				h.PrintError("could not monitor sync progress")
			}

			if msg == nil {
				continue
			}

			if json.Unmarshal(msg, &m) != nil {
				h.PrintError("could not parse response")
			}

			if m["_subject"].(string) == "build.import.done" {
				break
			}
		}

		time.Sleep(time.Second)

		build := client.Build().Get(project, env, action.ResourceID)

		switch build.Status {
		case "done":
			color.Green("No changes detected")
		case "awaiting_resolution":
			color.Red("Changes detected")
			fmt.Println("")

			builds := client.Build().List(project, env)

			b1 := buildIDFromIndex(builds, strconv.Itoa(len(builds)-1))
			b2 := buildIDFromIndex(builds, strconv.Itoa(len(builds)))

			changelog := client.Build().Diff(project, env, b1.ID, b2.ID)
			if len(*changelog) == 0 {
				color.Green("There are no changes detected")
				return nil
			}

			color.Red("If rejected, ernest will action the following changes:")

			view.PrintDiff(changelog)
		case "errored":
			color.Red("Sync failed!")
		}

		return nil
	},
}

SyncEnv command Syncs an environment with the cloud provider

View Source
var Target = cli.Command{
	Name:        "target",
	Aliases:     []string{"t"},
	Usage:       h.T("target.usage"),
	ArgsUsage:   h.T("target.args"),
	Description: h.T("target.description"),
	Action: func(c *cli.Context) error {
		paramsLenValidation(c, 1, "target.args")
		cfg := esetup(c, NoValidation).Config()

		cfg.URL = c.Args()[0]
		persistTarget(cfg)

		color.Green("Target set")
		return nil
	},
}

Target command Configures the ernest target instance

View Source
var UpdateAWSProject = cli.Command{
	Name:        "aws",
	Usage:       h.T("aws.update.usage"),
	ArgsUsage:   h.T("aws.update.args"),
	Description: h.T("aws.update.description"),
	Flags: []cli.Flag{
		tStringFlag("aws.update.flags.access_key_id"),
		tStringFlag("aws.update.flags.secret_access_key"),
	},
	Action: func(c *cli.Context) error {
		paramsLenValidation(c, 1, "aws.create.args")
		client := esetup(c, AuthUsersValidation)

		creds := parseTemplateFlags(c, map[string]flagDef{
			"access_key_id":     flagDef{typ: "string", mapto: "aws_access_key_id"},
			"secret_access_key": flagDef{typ: "string", mapto: "aws_secret_access_key"},
		})

		n := client.Project().Get(c.Args()[0])
		n.Credentials = creds
		client.Project().Update(n)
		color.Green(fmt.Sprintf(h.T("aws.update.success"), n.Name))

		return nil
	},
}

UpdateAWSProject : Updates the specified VCloud project

View Source
var UpdateAzureProject = cli.Command{
	Name:        "azure",
	Usage:       h.T("azure.update.usage"),
	Description: h.T("azure.update.description"),
	ArgsUsage:   h.T("azure.update.args"),
	Flags: []cli.Flag{
		tStringFlag("azure.update.flags.subscription_id"),
		tStringFlag("azure.update.flags.client_id"),
		tStringFlag("azure.update.flags.client_secret"),
		tStringFlag("azure.update.flags.tenant_id"),
		tStringFlag("azure.update.flags.environment"),
	},
	Action: func(c *cli.Context) error {
		paramsLenValidation(c, 1, "azure.update.args")
		client := esetup(c, AuthUsersValidation)

		creds := parseTemplateFlags(c, map[string]flagDef{
			"subscription_id": flagDef{typ: "string", mapto: "azure_subscription_id"},
			"client_id":       flagDef{typ: "string", mapto: "azure_client_id"},
			"client_secret":   flagDef{typ: "string", mapto: "azure_client_secret"},
			"tenant_id":       flagDef{typ: "string", mapto: "azure_tenant_id"},
			"environment":     flagDef{typ: "string", mapto: "azure_environment"},
		})

		n := client.Project().Get(c.Args()[0])
		n.Credentials = creds
		client.Project().Update(n)
		color.Green(fmt.Sprintf(h.T("azure.update.success"), n.Name))

		return nil
	},
}

UpdateAzureProject : Updates the specified VCloud project

View Source
var UpdateEnv = cli.Command{
	Name:        "update",
	Aliases:     []string{"a"},
	Usage:       h.T("envs.update.usage"),
	ArgsUsage:   h.T("envs.update.args"),
	Description: h.T("envs.update.description"),
	Flags: append([]cli.Flag{
		tStringFlagND("envs.update.flags.submissions"),
	}, AllProviderFlags...),
	Action: func(c *cli.Context) error {
		paramsLenValidation(c, 2, "envs.update.args")
		client := esetup(c, AuthUsersValidation)
		env := client.Environment().Get(c.Args()[0], c.Args()[1])
		env.Credentials = ProviderFlagsToSlice(c)
		env.Options = MapEnvOptions(c, env.Options)
		client.Environment().Update(env)
		color.Green("Environment successfully updated")

		return nil
	},
}

UpdateEnv : Creates an empty environment based on a name and a project name

View Source
var UpdateNotification = cli.Command{
	Name:        "update",
	Usage:       h.T("notification.update.usage"),
	ArgsUsage:   h.T("notification.update.args"),
	Description: h.T("notification.update.description"),
	Action: func(c *cli.Context) error {
		paramsLenValidation(c, 2, "notification.update.args")
		client := esetup(c, AuthUsersValidation)
		name := c.Args()[0]
		notificationConfig := c.Args()[1]

		n := client.Notification().Get(name)
		n.Config = notificationConfig
		client.Notification().Update(n)
		color.Green(fmt.Sprintf(h.T("notification.update.success"), name))
		return nil
	},
}

UpdateNotification : Will update the notification specific fields

View Source
var UpdatePolicy = cli.Command{
	Name:        "update",
	Usage:       h.T("policy.update.usage"),
	ArgsUsage:   h.T("policy.update.args"),
	Description: h.T("policy.update.description"),
	Flags: []cli.Flag{
		tStringFlag("policy.update.flags.name"),
		tStringFlag("policy.update.flags.spec"),
	},
	Action: func(c *cli.Context) error {
		flags := parseTemplateFlags(c, map[string]flagDef{
			"policy-name": flagDef{typ: "string", req: true},
			"spec":        flagDef{typ: "string", req: true},
		})
		client := esetup(c, AuthUsersValidation)
		name := flags["policy-name"].(string)
		spec, err := ioutil.ReadFile(flags["spec"].(string))
		if err != nil {
			h.PrintError(h.T("policy.update.errors.spec"))
		}

		client.Policy().CreateDocument(name, string(spec))
		color.Green(fmt.Sprintf(h.T("policy.update.success"), name))
		return nil
	},
}

UpdatePolicy : Will update the policy specific fields

View Source
var UpdateProjects = cli.Command{
	Name:        "update",
	Usage:       "Updates an existing project.",
	Description: "Update an existing project on the targeted instance of Ernest.",
	Subcommands: []cli.Command{
		UpdateVCloudProject,
		UpdateAWSProject,
		UpdateAzureProject,
	},
}

UpdateProjects : Will update the project specific fields

View Source
var UpdateVCloudProject = cli.Command{
	Name:        "vcloud",
	Usage:       h.T("vcloud.update.usage"),
	ArgsUsage:   h.T("vcloud.update.args"),
	Description: h.T("vcloud.update.description"),
	Flags: []cli.Flag{
		stringFlag("user", "", "Your VCloud valid user name"),
		stringFlag("password", "", "Your VCloud valid password"),
		stringFlag("org", "", "Your vCloud Organization"),
	},
	Action: func(c *cli.Context) error {
		paramsLenValidation(c, 1, "vcloud.update.args")
		client := esetup(c, AuthUsersValidation)

		creds := parseTemplateFlags(c, map[string]flagDef{
			"user":     flagDef{typ: "string"},
			"org":      flagDef{typ: "string"},
			"password": flagDef{typ: "string"},
		})
		creds["user"] = creds["user"].(string) + "@" + creds["org"].(string)

		n := client.Project().Get(c.Args()[0])
		n.Credentials["user"] = creds["user"].(string)
		n.Credentials["passwrord"] = creds["password"].(string)
		client.Project().Update(n)
		color.Green(fmt.Sprintf(h.T("vcloud.update.success"), n.Name))

		return nil
	},
}

UpdateVCloudProject : Updates the specified VCloud project

View Source
var ValidateEnv = cli.Command{
	Name:        "validate",
	Usage:       h.T("envs.validate.usage"),
	ArgsUsage:   h.T("envs.validate.args"),
	Description: h.T("envs.validate.description"),
	Action: func(c *cli.Context) error {
		paramsLenValidation(c, 2, "envs.validate.args")
		client := esetup(c, AuthUsersValidation)

		project := c.Args()[0]
		env := c.Args()[1]

		validation := client.Environment().Validate(project, env)

		view.PrintValidation(validation)

		return nil
	},
}

ValidateEnv command Validates an issue that requires user input

Functions

func Elogin

func Elogin(usr, pwd, vc string) *manager.Client

Elogin : logs in

func Esetup

func Esetup(c *cli.Context, vals []string) *manager.Client

Esetup : sets up connection to ernest

func MapEnvOptions

func MapEnvOptions(c *cli.Context, opts map[string]interface{}) map[string]interface{}

MapEnvOptions : maps environment options from cli context

func ProviderFlagsToSlice

func ProviderFlagsToSlice(c *cli.Context) map[string]interface{}

ProviderFlagsToSlice :

Types

type NullWriter

type NullWriter int

NullWriter to disable logging

func (NullWriter) Write

func (NullWriter) Write([]byte) (int, error)

Write sends to nowhere the log messages

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL