diff --git a/app/api/controller/infraprovider/controller.go b/app/api/controller/infraprovider/controller.go index 8fbe8b49c..256bb9ba8 100644 --- a/app/api/controller/infraprovider/controller.go +++ b/app/api/controller/infraprovider/controller.go @@ -39,7 +39,7 @@ type ResourceInput struct { Memory *string `json:"memory" yaml:"memory"` Disk *string `json:"disk" yaml:"disk"` Network *string `json:"network" yaml:"network"` - Region []string `json:"region" yaml:"region"` + Region string `json:"region" yaml:"region"` Metadata map[string]string `json:"metadata" yaml:"metadata"` GatewayHost *string `json:"gateway_host" yaml:"gateway_host"` GatewayPort *string `json:"gateway_port" yaml:"gateway_port"` diff --git a/app/api/controller/infraprovider/create_resources.go b/app/api/controller/infraprovider/create_resources.go index 02ce46700..6dd82184e 100644 --- a/app/api/controller/infraprovider/create_resources.go +++ b/app/api/controller/infraprovider/create_resources.go @@ -17,7 +17,6 @@ package infraprovider import ( "context" "fmt" - "strings" "time" apiauth "github.com/harness/gitness/app/api/auth" @@ -124,7 +123,7 @@ func (c *Controller) MapToResourceEntity( Memory: res.Memory, Disk: res.Disk, Network: res.Network, - Region: strings.Join(res.Region, " "), // TODO fix + Region: res.Region, Metadata: res.Metadata, Created: now, Updated: now, diff --git a/app/services/infraprovider/create_resource.go b/app/services/infraprovider/create_resource.go index 01fafa03c..decc676ab 100644 --- a/app/services/infraprovider/create_resource.go +++ b/app/services/infraprovider/create_resource.go @@ -19,7 +19,6 @@ import ( "errors" "fmt" - "github.com/harness/gitness/infraprovider" "github.com/harness/gitness/store" "github.com/harness/gitness/types" @@ -47,10 +46,27 @@ func (c *Service) createMissingResources( configID int64, spaceID int64, ) error { + emptyStr := "" for idx := range resources { resource := &resources[idx] resource.InfraProviderConfigID = configID resource.SpaceID = spaceID + if resource.CPU == nil { + resource.CPU = &emptyStr + } + if resource.Memory == nil { + resource.Memory = &emptyStr + } + if resource.Network == nil { + resource.Network = &emptyStr + } + // updating metadata based on infra provider type + updatedMetadata, err := c.updateResourceMetadata(resource) + if err != nil { + return fmt.Errorf("creating missing infra resources: %w", err) + } + resource.Metadata = updatedMetadata + if err := c.validateResource(ctx, resource); err != nil { return err } @@ -66,6 +82,20 @@ func (c *Service) createMissingResources( return nil } +func (c *Service) updateResourceMetadata(resource *types.InfraProviderResource) (map[string]string, error) { + infraProvider, err := c.infraProviderFactory.GetInfraProvider(resource.InfraProviderType) + if err != nil { + return nil, fmt.Errorf("failed to fetch infra impl for type : %q %w", resource.InfraProviderType, err) + } + + params, err := infraProvider.UpdateParams(toResourceParams(resource.Metadata)) + if err != nil { + return nil, err + } + + return toMetadata(params), nil +} + func (c *Service) validateResource(ctx context.Context, resource *types.InfraProviderResource) error { infraProvider, err := c.infraProviderFactory.GetInfraProvider(resource.InfraProviderType) if err != nil { @@ -79,7 +109,7 @@ func (c *Service) validateResource(ctx context.Context, resource *types.InfraPro } } - err = c.validateResourceParams(infraProvider, *resource) + err = infraProvider.ValidateParams(toResourceParams(resource.Metadata)) if err != nil { return err } @@ -87,16 +117,24 @@ func (c *Service) validateResource(ctx context.Context, resource *types.InfraPro return err } -func (c *Service) validateResourceParams( - infraProvider infraprovider.InfraProvider, - res types.InfraProviderResource, -) error { - infraResourceParams := make([]types.InfraProviderParameter, 0) - for key, value := range res.Metadata { +func toResourceParams(metadata map[string]string) []types.InfraProviderParameter { + var infraResourceParams []types.InfraProviderParameter + for key, value := range metadata { infraResourceParams = append(infraResourceParams, types.InfraProviderParameter{ Name: key, Value: value, }) } - return infraProvider.ValidateParams(infraResourceParams) + + return infraResourceParams +} + +func toMetadata(params []types.InfraProviderParameter) map[string]string { + metadata := make(map[string]string) + + for _, param := range params { + metadata[param.Name] = param.Value + } + + return metadata } diff --git a/infraprovider/docker_provider.go b/infraprovider/docker_provider.go index b13736804..cf810d313 100644 --- a/infraprovider/docker_provider.go +++ b/infraprovider/docker_provider.go @@ -288,6 +288,10 @@ func (d DockerProvider) ValidateParams(_ []types.InfraProviderParameter) error { return nil } +func (d DockerProvider) UpdateParams(ip []types.InfraProviderParameter) ([]types.InfraProviderParameter, error) { + return ip, nil +} + // TemplateParams returns nil as no template params are used. func (d DockerProvider) TemplateParams() []types.InfraProviderParameterSchema { return nil diff --git a/infraprovider/infra_provider.go b/infraprovider/infra_provider.go index de914c867..9bdf37e2e 100644 --- a/infraprovider/infra_provider.go +++ b/infraprovider/infra_provider.go @@ -70,6 +70,9 @@ type InfraProvider interface { // AvailableParams provides a schema to define the infrastructure. AvailableParams() []types.InfraProviderParameterSchema + // UpdateParams updates input Parameters to add or modify given inputParameters. + UpdateParams(inputParameters []types.InfraProviderParameter) ([]types.InfraProviderParameter, error) + // ValidateParams validates the supplied params before defining the infrastructure resource . ValidateParams(inputParameters []types.InfraProviderParameter) error