Explorar el Código

add 3 separate drivers

Mohammed Nafees hace 4 años
padre
commit
37a3c0a7d5

+ 5 - 3
cli/cmd/apply.go

@@ -97,10 +97,12 @@ func apply(_ *types.GetAuthenticatedUserResponse, client *api.Client, args []str
 	}
 
 	worker := worker.NewWorker()
-	worker.RegisterDriver("porter.deploy", NewPorterDriver)
-	worker.RegisterDriver("porter.build", preview.NewBuildDriver)
+	worker.RegisterDriver("deploy", NewPorterDriver)
+	worker.RegisterDriver("build-image", preview.NewBuildDriver)
+	worker.RegisterDriver("push-image", preview.NewPushDriver)
+	worker.RegisterDriver("update-config", preview.NewUpdateConfigDriver)
 
-	worker.SetDefaultDriver("porter.deploy")
+	worker.SetDefaultDriver("deploy")
 
 	if hasDeploymentHookEnvVars() {
 		deplNamespace := os.Getenv("PORTER_NAMESPACE")

+ 0 - 6
cli/cmd/deploy/create.go

@@ -480,8 +480,6 @@ func (c *CreateAgent) GetMergedValues(overrideValues map[string]interface{}) (st
 		return "", nil, err
 	}
 
-	fmt.Printf("latestVersion: %v\n", latestVersion)
-
 	// get the values of the template
 	values, err := c.GetLatestTemplateDefaultValues(c.CreateOpts.Kind, latestVersion)
 
@@ -489,8 +487,6 @@ func (c *CreateAgent) GetMergedValues(overrideValues map[string]interface{}) (st
 		return "", nil, err
 	}
 
-	fmt.Printf("values: %v\n", values)
-
 	err = coalesceEnvGroups(c.Client, c.CreateOpts.ProjectID, c.CreateOpts.ClusterID,
 		c.CreateOpts.Namespace, c.CreateOpts.EnvGroups, values)
 
@@ -498,8 +494,6 @@ func (c *CreateAgent) GetMergedValues(overrideValues map[string]interface{}) (st
 		return "", nil, err
 	}
 
-	fmt.Printf("values: %v\n", values)
-
 	// merge existing values with overriding values
 	mergedValues := utils.CoalesceValues(values, overrideValues)
 

+ 12 - 15
cli/cmd/preview/build_driver.go → cli/cmd/preview/build_image_driver.go

@@ -61,14 +61,11 @@ func NewBuildDriver(resource *models.Resource, opts *drivers.SharedDriverOpts) (
 		return nil, err
 	}
 
-	driver.target = target
-
-	buildDriverConfig, err := driver.getConfig(resource)
-	if err != nil {
-		return nil, err
+	if target.AppName == "" {
+		return nil, fmt.Errorf("target app_name is missing")
 	}
 
-	driver.config = buildDriverConfig
+	driver.target = target
 
 	return driver, nil
 }
@@ -78,8 +75,16 @@ func (d *BuildDriver) ShouldApply(resource *models.Resource) bool {
 }
 
 func (d *BuildDriver) Apply(resource *models.Resource) (*models.Resource, error) {
+	buildDriverConfig, err := d.getConfig(resource)
+	if err != nil {
+		return nil, err
+	}
+
+	d.config = buildDriverConfig
+
 	client := config.GetAPIClient()
 
+	// FIXME: give tag option in config build, but override if PORTER_TAG is present
 	tag := os.Getenv("PORTER_TAG")
 
 	if tag == "" {
@@ -186,9 +191,6 @@ func (d *BuildDriver) Apply(resource *models.Resource) (*models.Resource, error)
 
 	imageExists := agent.CheckIfImageExists(imageURL, tag) // FIXME: does not seem to work with gcr.io images
 
-	fmt.Printf("imageExists: %v\n", imageExists)
-	fmt.Printf("force_build: %v\n", d.config.Build.ForceBuild)
-
 	if imageExists && tag != "latest" && !d.config.Build.ForceBuild {
 		fmt.Printf("%s:%s already exists in the registry, so skipping build\n", imageURL, tag)
 	} else {
@@ -198,8 +200,6 @@ func (d *BuildDriver) Apply(resource *models.Resource) (*models.Resource, error)
 			return nil, err
 		}
 
-		fmt.Printf("mergedValues: %v\n", mergedValues)
-
 		env, err := deploy.GetEnvForRelease(
 			client,
 			mergedValues,
@@ -212,8 +212,6 @@ func (d *BuildDriver) Apply(resource *models.Resource) (*models.Resource, error)
 			env = map[string]string{}
 		}
 
-		fmt.Printf("env: %v\n", env)
-
 		buildAgent := &deploy.BuildAgent{
 			SharedOpts:  createAgent.CreateOpts.SharedOpts,
 			APIClient:   client,
@@ -268,8 +266,7 @@ func (d *BuildDriver) Apply(resource *models.Resource) (*models.Resource, error)
 	d.output["registry_url"] = domain
 	d.output["image_repo"] = imageRepo
 	d.output["image_tag"] = tag
-
-	fmt.Println(d.output)
+	d.output["image"] = fmt.Sprintf("%s:%s", imageURL, tag)
 
 	return resource, nil
 }

+ 0 - 28
cli/cmd/preview/push_driver.go

@@ -1,28 +0,0 @@
-package preview
-
-import (
-	"github.com/porter-dev/switchboard/pkg/drivers"
-	"github.com/porter-dev/switchboard/pkg/models"
-)
-
-type PushDriver struct {
-	output map[string]interface{}
-}
-
-func NewPushDriver(resource *models.Resource, opts *drivers.SharedDriverOpts) (drivers.Driver, error) {
-	return &PushDriver{
-		output: make(map[string]interface{}),
-	}, nil
-}
-
-func (d *PushDriver) ShouldApply(resource *models.Resource) bool {
-	return true
-}
-
-func (d *PushDriver) Apply(resource *models.Resource) (*models.Resource, error) {
-	return resource, nil
-}
-
-func (d *PushDriver) Output() (map[string]interface{}, error) {
-	return d.output, nil
-}

+ 101 - 0
cli/cmd/preview/push_image_driver.go

@@ -0,0 +1,101 @@
+package preview
+
+import (
+	"fmt"
+
+	"github.com/mitchellh/mapstructure"
+	"github.com/porter-dev/porter/cli/cmd/config"
+	"github.com/porter-dev/porter/cli/cmd/docker"
+	"github.com/porter-dev/switchboard/pkg/drivers"
+	"github.com/porter-dev/switchboard/pkg/models"
+)
+
+type PushDriverConfig struct {
+	Push struct {
+		ForcePush bool `mapstructure:"force_build"`
+		UseCache  bool `mapstructure:"use_cache"`
+		Image     string
+	}
+}
+
+type PushDriver struct {
+	target      *Target
+	config      *PushDriverConfig
+	lookupTable *map[string]drivers.Driver
+	output      map[string]interface{}
+}
+
+func NewPushDriver(resource *models.Resource, opts *drivers.SharedDriverOpts) (drivers.Driver, error) {
+	driver := &PushDriver{
+		lookupTable: opts.DriverLookupTable,
+		output:      make(map[string]interface{}),
+	}
+
+	target, err := GetTarget(resource.Target)
+	if err != nil {
+		return nil, err
+	}
+
+	if target.AppName == "" {
+		return nil, fmt.Errorf("target app_name is missing")
+	}
+
+	driver.target = target
+
+	return driver, nil
+}
+
+func (d *PushDriver) ShouldApply(resource *models.Resource) bool {
+	return true
+}
+
+func (d *PushDriver) Apply(resource *models.Resource) (*models.Resource, error) {
+	pushDriverConfig, err := d.getConfig(resource)
+	if err != nil {
+		return nil, err
+	}
+
+	d.config = pushDriverConfig
+
+	client := config.GetAPIClient()
+
+	agent, err := docker.NewAgentWithAuthGetter(client, d.target.Project)
+	if err != nil {
+		return nil, err
+	}
+
+	err = agent.PushImage(d.config.Push.Image)
+	if err != nil {
+		return nil, err
+	}
+
+	d.output["image"] = d.config.Push.Image
+
+	return resource, nil
+}
+
+func (d *PushDriver) Output() (map[string]interface{}, error) {
+	return d.output, nil
+}
+
+func (d *PushDriver) getConfig(resource *models.Resource) (*PushDriverConfig, error) {
+	populatedConf, err := drivers.ConstructConfig(&drivers.ConstructConfigOpts{
+		RawConf:      resource.Config,
+		LookupTable:  *d.lookupTable,
+		Dependencies: resource.Dependencies,
+	})
+
+	if err != nil {
+		return nil, err
+	}
+
+	config := &PushDriverConfig{}
+
+	err = mapstructure.Decode(populatedConf, config)
+
+	if err != nil {
+		return nil, err
+	}
+
+	return config, nil
+}

+ 172 - 0
cli/cmd/preview/update_config_driver.go

@@ -0,0 +1,172 @@
+package preview
+
+import (
+	"context"
+	"fmt"
+	"os"
+
+	"github.com/cli/cli/git"
+	"github.com/fatih/color"
+	"github.com/mitchellh/mapstructure"
+	"github.com/porter-dev/porter/api/types"
+	"github.com/porter-dev/porter/cli/cmd/config"
+	"github.com/porter-dev/porter/cli/cmd/deploy"
+	"github.com/porter-dev/switchboard/pkg/drivers"
+	"github.com/porter-dev/switchboard/pkg/models"
+)
+
+type UpdateConfigDriverConfig struct {
+	UpdateConfig struct {
+		Image string
+	} `mapstructure:"update_config"`
+
+	EnvGroups []types.EnvGroupMeta `mapstructure:"env_groups"`
+
+	Values map[string]interface{}
+}
+
+type UpdateConfigDriver struct {
+	source      *Source
+	target      *Target
+	config      *UpdateConfigDriverConfig
+	lookupTable *map[string]drivers.Driver
+	output      map[string]interface{}
+}
+
+func NewUpdateConfigDriver(resource *models.Resource, opts *drivers.SharedDriverOpts) (drivers.Driver, error) {
+	driver := &UpdateConfigDriver{
+		lookupTable: opts.DriverLookupTable,
+		output:      make(map[string]interface{}),
+	}
+
+	source, err := GetSource(resource.Source)
+	if err != nil {
+		return nil, err
+	}
+
+	driver.source = source
+
+	target, err := GetTarget(resource.Target)
+	if err != nil {
+		return nil, err
+	}
+
+	if target.AppName == "" {
+		return nil, fmt.Errorf("target app_name is missing")
+	}
+
+	driver.target = target
+
+	return driver, nil
+}
+
+func (d *UpdateConfigDriver) ShouldApply(resource *models.Resource) bool {
+	return true
+}
+
+func (d *UpdateConfigDriver) Apply(resource *models.Resource) (*models.Resource, error) {
+	updateConfigDriverConfig, err := d.getConfig(resource)
+	if err != nil {
+		return nil, err
+	}
+
+	d.config = updateConfigDriverConfig
+
+	client := config.GetAPIClient()
+
+	_, err = client.GetRelease(
+		context.Background(),
+		d.target.Project,
+		d.target.Cluster,
+		d.target.Namespace,
+		d.target.AppName,
+	)
+
+	shouldCreate := err != nil
+
+	// FIXME: give tag option in config build, but override if PORTER_TAG is present
+	tag := os.Getenv("PORTER_TAG")
+
+	if tag == "" {
+		commit, err := git.LastCommit()
+
+		if err != nil {
+			return nil, err
+		}
+
+		tag = commit.Sha[:7]
+	}
+
+	sharedOpts := &deploy.SharedOpts{
+		ProjectID:   d.target.Project,
+		ClusterID:   d.target.Cluster,
+		OverrideTag: tag,
+		Namespace:   d.target.Namespace,
+		Method:      "registry",
+		EnvGroups:   d.config.EnvGroups,
+	}
+
+	if shouldCreate {
+		color.New(color.FgYellow).Printf("Could not read release %s/%s (%s): attempting creation\n", d.target.Namespace, d.target.AppName, err.Error())
+
+		createAgent := &deploy.CreateAgent{
+			Client: client,
+			CreateOpts: &deploy.CreateOpts{
+				SharedOpts:  sharedOpts,
+				Kind:        d.source.Name,
+				ReleaseName: d.target.AppName,
+			},
+		}
+
+		subdomain, err := createAgent.CreateFromRegistry(d.config.UpdateConfig.Image, d.config.Values)
+
+		if err != nil {
+			return nil, err
+		}
+
+		d.output["live_url"] = subdomain
+	} else {
+		updateAgent, err := deploy.NewDeployAgent(client, d.target.AppName, &deploy.DeployOpts{
+			SharedOpts: sharedOpts,
+			Local:      false,
+		})
+
+		if err != nil {
+			return nil, err
+		}
+
+		err = updateAgent.UpdateImageAndValues(d.config.Values)
+
+		if err != nil {
+			return nil, err
+		}
+	}
+
+	return resource, nil
+}
+
+func (d *UpdateConfigDriver) Output() (map[string]interface{}, error) {
+	return d.output, nil
+}
+
+func (d *UpdateConfigDriver) getConfig(resource *models.Resource) (*UpdateConfigDriverConfig, error) {
+	populatedConf, err := drivers.ConstructConfig(&drivers.ConstructConfigOpts{
+		RawConf:      resource.Config,
+		LookupTable:  *d.lookupTable,
+		Dependencies: resource.Dependencies,
+	})
+
+	if err != nil {
+		return nil, err
+	}
+
+	config := &UpdateConfigDriverConfig{}
+
+	err = mapstructure.Decode(populatedConf, config)
+
+	if err != nil {
+		return nil, err
+	}
+
+	return config, nil
+}

+ 0 - 28
cli/cmd/preview/upgrade_driver.go

@@ -1,28 +0,0 @@
-package preview
-
-import (
-	"github.com/porter-dev/switchboard/pkg/drivers"
-	"github.com/porter-dev/switchboard/pkg/models"
-)
-
-type UpgradeDriver struct {
-	output map[string]interface{}
-}
-
-func NewUpgradeDriver(resource *models.Resource, opts *drivers.SharedDriverOpts) (drivers.Driver, error) {
-	return &UpgradeDriver{
-		output: make(map[string]interface{}),
-	}, nil
-}
-
-func (d *UpgradeDriver) ShouldApply(resource *models.Resource) bool {
-	return true
-}
-
-func (d *UpgradeDriver) Apply(resource *models.Resource) (*models.Resource, error) {
-	return resource, nil
-}
-
-func (d *UpgradeDriver) Output() (map[string]interface{}, error) {
-	return d.output, nil
-}