From 620183618d8d4d1698f5f97b5e538b87dd3d20d8 Mon Sep 17 00:00:00 2001 From: Jan Duursma Date: Wed, 26 Jun 2024 21:51:19 -0700 Subject: [PATCH] fix: use pointers to deal with empty values --- ecs.go | 823 ++++++++++++++++------------ ecs_test.go | 7 +- examples/Cluster/config.json | 14 +- examples/TaskDefinition/config.json | 4 +- go.mod | 14 +- go.sum | 28 +- 6 files changed, 501 insertions(+), 389 deletions(-) diff --git a/ecs.go b/ecs.go index c0cc89c..f9674f1 100644 --- a/ecs.go +++ b/ecs.go @@ -31,44 +31,46 @@ type AccountSettingDefaultConfig struct { // CapacityProviderConfig defines arguments for AWS ECS capacity provider. type CapacityProviderConfig struct { - Name string `json:"name"` AutoscalingGroupProvider struct { - AutoscalingGroupArn string `json:"autoscalingGroupArn"` - ManagedDraining string `json:"managedDraining"` - ManagedScaling struct { - InstanceWarmupPeriod int `json:"instanceWarmupPeriod"` - MaximumScalingStepSize int `json:"maximumScalingStepSize"` - MinimumScalingStepSize int `json:"minimumScalingStepSize"` - Status string `json:"status"` - TargetCapacity int `json:"targetCapacity"` + AutoscalingGroupArn string `json:"autoscalingGroupArn"` + ManagedDraining *string `json:"managedDraining,omitempty"` + ManagedScaling *struct { + InstanceWarmupPeriod *int `json:"instanceWarmupPeriod,omitempty"` + MaximumScalingStepSize *int `json:"maximumScalingStepSize,omitempty"` + MinimumScalingStepSize *int `json:"minimumScalingStepSize,omitempty"` + Status *string `json:"status,omitempty"` + TargetCapacity *int `json:"targetCapacity,omitempty"` } `json:"managedScaling"` - ManagedTerminationProtection string `json:"managedTerminationProtection"` + ManagedTerminationProtection *string `json:"managedTerminationProtection,omitempty"` } `json:"autoscalingGroupProvider"` - Tags map[string]string `json:"tags"` + Name string `json:"name"` + Tags map[string]string `json:"tags,omitempty"` } // ClusterConfig defines arguments for creating an AWS ECS cluster. type ClusterConfig struct { - Name string `json:"name"` - Configuration struct { + Configuration *struct { ExecuteCommand struct { - KmsKeyID string `json:"kmsKeyId"` - Logging string `json:"logging"` + KmsKeyID *string `json:"kmsKeyId,omitempty"` + LogConfiguration *struct { + CloudWatchEncryptionEnabled *bool `json:"cloudWatchEncryptionEnabled,omitempty"` + CloudWatchLogGroupName *string `json:"cloudWatchLogGroupName,omitempty"` + S3BucketEncryptionEnabled *bool `json:"s3BucketEncryptionEnabled,omitempty"` + S3BucketName *string `json:"s3BucketName,omitempty"` + S3KeyPrefix *string `json:"s3KeyPrefix,omitempty"` + } `json:"logConfiguration"` + Logging *string `json:"logging,omitempty"` } `json:"executeCommand"` - LogConfiguration struct { - CloudWatchEncryptionEnabled bool `json:"cloudWatchEncryptionEnabled"` - CloudWatchLogGroupName string `json:"cloudWatchLogGroupName"` - S3BucketEncryptionEnabled bool `json:"s3BucketEncryptionEnabled"` - S3BucketName string `json:"s3BucketName"` - S3KeyPrefix string `json:"s3KeyPrefix"` - } `json:"logConfiguration"` } `json:"configuration"` + Name string `json:"name"` + ServiceConnectDefaults *struct { + Namespace string `json:"namespace"` + } `json:"serviceConnectDefaults"` Settings []struct { Name string `json:"name"` Value string `json:"value"` } `json:"settings"` - ServiceConnectNamespace string `json:"serviceConnectNamespace"` - Tags map[string]string `json:"tags"` + Tags map[string]string `json:"tags,omitempty"` } // clusterOutput defines outputs from the AWS ECS cluster creation. @@ -79,109 +81,123 @@ type clusterOutput struct { // ClusterCapacityProviderConfig defines arguments for setting up capacity providers for an AWS ECS cluster. type ClusterCapacityProviderConfig struct { + CapacityProviders []string `json:"capacityProviders,omitempty"` ClusterName string `json:"clusterName"` - CapacityProviders []string `json:"capacityProviders"` DefaultCapacityProviderStrategies []struct { - Base int `json:"base"` + Base *int `json:"base,omitempty"` CapacityProvider string `json:"capacityProvider"` - Weight int `json:"weight"` + Weight *int `json:"weight,omitempty"` } `json:"defaultCapacityProviderStrategies"` } // ServiceConfig defines arguments for creating an AWS ECS service. type ServiceConfig struct { - Name string `json:"name"` - ClusterArn string `json:"clusterArn"` - TaskDefinition string `json:"taskDefinition"` - DesiredCount int `json:"desiredCount"` - Alarms struct { + Alarms *struct { AlarmNames []string `json:"alarmNames"` Enable bool `json:"enable"` Rollback bool `json:"rollback"` } `json:"alarms"` CapacityProviderStrategies []struct { - Name string `json:"name"` - Base int `json:"base"` - Weight int `json:"weight"` + CapacityProvider string `json:"name"` + Base *int `json:"base,omitempty"` + Weight *int `json:"weight,omitempty"` } `json:"capacityProviderStrategies"` - IamRole string `json:"iamRole"` - DeploymentCircuitBreaker struct { + ClusterArn string `json:"clusterArn"` + DeploymentCircuitBreaker *struct { Enable bool `json:"enable"` Rollback bool `json:"rollback"` } `json:"deploymentCircuitBreaker"` - DeploymentController struct { - Type string `json:"type"` + DeploymentController *struct { + Type *string `json:"type,omitempty"` } `json:"deploymentController"` - DeploymentMaximumPercent int `json:"deploymentMaximumPercent"` - DeploymentMinimumHealthyPercent int `json:"deploymentMinimumHealthyPercent"` - EnableEcsManagedTags bool `json:"enableEcsManagedTags"` - EnableExecuteCommand bool `json:"enableExecuteCommand"` - ForceNewDeployment bool `json:"forceNewDeployment"` - HealthCheckGracePeriodSeconds int `json:"healthCheckGracePeriodSeconds"` - LaunchType string `json:"launchType"` + DeploymentMaximumPercent *int `json:"deploymentMaximumPercent,omitempty"` + DeploymentMinimumHealthyPercent *int `json:"deploymentMinimumHealthyPercent,omitempty"` + DesiredCount *int `json:"desiredCount,omitempty"` + EnableEcsManagedTags *bool `json:"enableEcsManagedTags,omitempty"` + EnableExecuteCommand *bool `json:"enableExecuteCommand,omitempty"` + ForceNewDeployment *bool `json:"forceNewDeployment,omitempty"` + HealthCheckGracePeriodSeconds *int `json:"healthCheckGracePeriodSeconds,omitempty"` + IamRole *string `json:"iamRole,omitempty"` + LaunchType *string `json:"launchType,omitempty"` LoadBalancers []struct { - ContainerName string `json:"containerName"` - ContainerPort int `json:"containerPort"` - ElbName string `json:"elbName"` - TargetGroupArn string `json:"targetGroupArn"` + ContainerName string `json:"containerName"` + ContainerPort int `json:"containerPort"` + ElbName *string `json:"elbName,omitempty"` + TargetGroupArn *string `json:"targetGroupArn,omitempty"` } `json:"loadBalancers"` - NetworkConfiguration struct { + Name string `json:"name"` + NetworkConfiguration *struct { + AssignPublicIP *bool `json:"assignPublicIp,omitempty"` + SecurityGroups []string `json:"securityGroups,omitempty"` Subnets []string `json:"subnets"` - AssignPublicIP bool `json:"assignPublicIp"` - SecurityGroups []string `json:"securityGroups"` } `json:"networkConfiguration"` OrderedPlacementStrategies []struct { - Type string `json:"type"` - Field string `json:"field"` + Field *string `json:"field,omitempty"` + Type string `json:"type"` } `json:"orderedPlacementStrategies"` PlacementConstraints []struct { - Type string `json:"type"` - Expression string `json:"expression"` + Expression *string `json:"expression,omitempty"` + Type string `json:"type"` } `json:"placementConstraints"` - PlatformVersion string `json:"platformVersion"` - PropagateTags string `json:"propagateTags"` - SchedulingStrategy string `json:"schedulingStrategy"` - ServiceConnectConfiguration struct { + PlatformVersion *string `json:"platformVersion,omitempty"` + PropagateTags *string `json:"propagateTags,omitempty"` + SchedulingStrategy *string `json:"schedulingStrategy,omitempty"` + ServiceConnectConfiguration *struct { Enabled bool `json:"enabled"` - LogConfiguration struct { + LogConfiguration *struct { LogDriver string `json:"logDriver"` - Options map[string]string `json:"options"` + Options map[string]string `json:"options,omitempty"` SecretOptions []struct { Name string `json:"name"` ValueFrom string `json:"valueFrom"` } `json:"secretOptions"` } `json:"logConfiguration"` - Namespace string `json:"namespace"` + Namespace *string `json:"namespace,omitempty"` Services []struct { - PortName string `json:"portName"` ClientAlias []struct { Port int `json:"port"` - DNSName string `json:"dnsName"` + DNSName string `json:"dnsName,omitempty"` } `json:"clientAlias"` - DiscoveryName string `json:"discoveryName"` - IngressPortOverride int `json:"ingressPortOverride"` - Timeout struct { - IdleTimeoutSeconds int `json:"idleTimeoutSeconds"` - PerRequestTimeoutSeconds int `json:"perRequestTimeoutSeconds"` + DiscoveryName *string `json:"discoveryName,omitempty"` + IngressPortOverride *int `json:"ingressPortOverride,omitempty"` + PortName string `json:"portName"` + Timeout *struct { + IdleTimeoutSeconds *int `json:"idleTimeoutSeconds,omitempty"` + PerRequestTimeoutSeconds *int `json:"perRequestTimeoutSeconds,omitempty"` } `json:"timeout"` - TLS struct { + TLS *struct { IssuerCertAuthority struct { AwsPcaAuthorityArn string `json:"awsPcaAuthorityArn"` } `json:"issuerCertAuthority"` - KmsKey string `json:"kmsKey"` - RoleArn string `json:"roleArn"` + KmsKey *string `json:"kmsKey,omitempty"` + RoleArn *string `json:"roleArn,omitempty"` } `json:"tls"` } `json:"services"` } `json:"serviceConnectConfiguration"` - ServiceRegistry struct { - ContainerName string `json:"containerName"` - ContainerPort int `json:"containerPort"` - Port int `json:"port"` - RegistryArn string `json:"registryArn"` + ServiceRegistry *struct { + ContainerName *string `json:"containerName,omitempty"` + ContainerPort *int `json:"containerPort,omitempty"` + Port *int `json:"port,omitempty"` + RegistryArn string `json:"registryArn"` } `json:"serviceRegistry"` + ServiceVolumeConfiguration *struct { + ManagedEBSVolume struct { + Encrypted *bool `json:"encrypted,omitempty"` + FileSystemType *string `json:"fileSystemType,omitempty"` + Iops *int `json:"iops,omitempty"` + KmsKeyID *string `json:"kmsKeyId,omitempty"` + RoleArn string `json:"roleArn"` + SizeInGB *int `json:"sizeInGb,omitempty"` + SnapshotID *string `json:"snapshotId,omitempty"` + Throughput *string `json:"throughput,omitempty"` + VolumeType *string `json:"volumeType,omitempty"` + } `json:"managedEBSVolume"` + Name string `json:"name"` + } `json:"serviceVolumeConfiguration"` Tags map[string]string `json:"tags"` + TaskDefinition *string `json:"taskDefinition,omitempty"` Triggers map[string]string `json:"triggers"` - WaitForSteadyState bool `json:"waitForSteadyState"` + WaitForSteadyState *bool `json:"waitForSteadyState,omitempty"` } // serviceOutput defines outputs from the AWS ECS service creation. @@ -191,57 +207,59 @@ type serviceOutput struct { // TaskDefinitionConfig defines arguments for creating an AWS ECS task definition. type TaskDefinitionConfig struct { - Name string `json:"name"` - ContainerDefinitions []map[string]interface{} `json:"containerDefinitions"` - NetworkMode string `json:"networkMode"` - CPU string `json:"cpu"` - EphemeralStorage int `json:"ephemeralStorage"` - ExecutionRoleArn string `json:"executionRoleArn"` - IpcMode string `json:"ipcMode"` + ContainerDefinitions []map[string]interface{} `json:"containerDefinitions"` + CPU *string `json:"cpu,omitempty"` + EphemeralStorage *struct { + SizeInGB int `json:"sizeInGb"` + } `json:"ephemeralStorage"` + ExecutionRoleArn *string `json:"executionRoleArn,omitempty"` InferenceAccelerators []struct { DeviceName string `json:"deviceName"` DeviceType string `json:"deviceType"` } `json:"inferenceAccelerators"` - Memory string `json:"memory"` - PidMode string `json:"pidMode"` + IpcMode *string `json:"ipcMode,omitempty"` + Memory *string `json:"memory,omitempty"` + Name string `json:"name"` + NetworkMode *string `json:"networkMode,omitempty"` + PidMode *string `json:"pidMode,omitempty"` PlacementConstraints []struct { - Expression string `json:"expression"` - Type string `json:"type"` + Expression *string `json:"expression,omitempty"` + Type string `json:"type"` } `json:"placementConstraints"` - ProxyConfiguration struct { + ProxyConfiguration *struct { ContainerName string `json:"containerName"` Properties map[string]string `json:"properties"` - Type string `json:"type"` + Type *string `json:"type,omitempty"` } `json:"proxyConfiguration"` RequiresCompatibilities []string `json:"requiresCompatibilities"` - RuntimePlatform struct { - CPUArchitecture string `json:"cpuArchitecture"` - OperatingSystemFamily string `json:"operatingSystemFamily"` + RuntimePlatform *struct { + CPUArchitecture *string `json:"cpuArchitecture,omitempty"` + OperatingSystemFamily *string `json:"operatingSystemFamily,omitempty"` } `json:"runtimePlatform"` - SkipDestroy bool `json:"skipDestroy"` + SkipDestroy *bool `json:"skipDestroy,omitempty"` Tags map[string]string `json:"tags"` - TaskRoleArn string `json:"taskRoleArn"` - TrackLatest bool `json:"trackLatest"` + TaskRoleArn *string `json:"taskRoleArn,omitempty"` + TrackLatest *bool `json:"trackLatest,omitempty"` Volumes []struct { - Name string `json:"name"` - DockerVolumeConfiguration struct { - Autoprovision bool `json:"autoprovision"` - Driver string `json:"driver"` + ConfigureAtLaunch *bool `json:"configureAtLaunch,omitempty"` + DockerVolumeConfiguration *struct { + Autoprovision *bool `json:"autoprovision,omitempty"` + Driver *string `json:"driver,omitempty"` DriverOpts map[string]string `json:"driverOpts"` Labels map[string]string `json:"labels"` - Scope string `json:"scope"` + Scope *string `json:"scope,omitempty"` } `json:"dockerVolumeConfiguration"` - EfsVolumeConfiguration struct { - FileSystemID string `json:"fileSystemId"` - AuthorizationConfig struct { - AccessPointID string `json:"accessPointId"` - Iam string `json:"iam"` + EfsVolumeConfiguration *struct { + AuthorizationConfig *struct { + AccessPointID *string `json:"accessPointId,omitempty"` + Iam *string `json:"iam,omitempty"` } `json:"authorizationConfig"` - RootDirectory string `json:"rootDirectory"` - TransitEncryption string `json:"transitEncryption"` - TransitEncryptionPort int `json:"transitEncryptionPort"` + FileSystemID string `json:"fileSystemId"` + RootDirectory *string `json:"rootDirectory,omitempty"` + TransitEncryption *string `json:"transitEncryption,omitempty"` + TransitEncryptionPort *int `json:"transitEncryptionPort,omitempty"` } `json:"efsVolumeConfiguration"` - FsxWindowsFileServerVolumeConfiguration struct { + FsxWindowsFileServerVolumeConfiguration *struct { AuthorizationConfig struct { CredentialsParameter string `json:"credentialsParameter"` Domain string `json:"domain"` @@ -249,7 +267,8 @@ type TaskDefinitionConfig struct { FileSystemID string `json:"fileSystemId"` RootDirectory string `json:"rootDirectory"` } `json:"fsxWindowsFileServerVolumeConfiguration"` - HostPath string `json:"hostPath"` + HostPath *string `json:"hostPath,omitempty"` + Name string `json:"name"` } `json:"volumes"` } @@ -260,43 +279,43 @@ type taskDefinitionOutput struct { // TaskSetConfig defines arguments for creating an AWS ECS task set. type TaskSetConfig struct { - Name string `json:"name"` - Service string `json:"service"` - Cluster string `json:"cluster"` - TaskDefinition string `json:"taskDefinition"` CapacityProviderStrategies []struct { - Base int `json:"base"` + Base *int `json:"base,omitempty"` CapacityProvider string `json:"capacityProvider"` Weight int `json:"weight"` } `json:"capacityProviderStrategies"` - ExternalID string `json:"externalId"` - ForceDelete bool `json:"forceDelete"` - LaunchType string `json:"launchType"` + Cluster string `json:"cluster"` + ExternalID *string `json:"externalId,omitempty"` + ForceDelete *bool `json:"forceDelete,omitempty"` + LaunchType *string `json:"launchType,omitempty"` LoadBalancers []struct { - ContainerName string `json:"containerName"` - ContainerPort int `json:"containerPort"` - LoadBalancerName string `json:"loadBalancerName"` - TargetGroupArn string `json:"targetGroupArn"` + ContainerName string `json:"containerName"` + ContainerPort *int `json:"containerPort,omitempty"` + LoadBalancerName *string `json:"loadBalancerName,omitempty"` + TargetGroupArn *string `json:"targetGroupArn,omitempty"` } `json:"loadBalancers"` - NetworkConfiguration struct { - Subnets []string `json:"subnets"` - AssignPublicIP bool `json:"assignPublicIp"` + Name string `json:"name"` + NetworkConfiguration *struct { + AssignPublicIP *bool `json:"assignPublicIp,omitempty"` SecurityGroups []string `json:"securityGroups"` + Subnets []string `json:"subnets"` } `json:"networkConfiguration"` - PlatformVersion string `json:"platformVersion"` - Scale struct { - Unit string `json:"unit"` - Value int `json:"value"` + PlatformVersion *string `json:"platformVersion,omitempty"` + Scale *struct { + Unit *string `json:"unit,omitempty"` + Value *float64 `json:"value,omitempty"` } `json:"scale"` - ServiceRegistries struct { - RegistryArn string `json:"registryArn"` - ContainerName string `json:"containerName"` - ContainerPort int `json:"containerPort"` - Port int `json:"port"` + Service string `json:"service"` + ServiceRegistries *struct { + ContainerName *string `json:"containerName,omitempty"` + ContainerPort *int `json:"containerPort,omitempty"` + Port *int `json:"port,omitempty"` + RegistryArn string `json:"registryArn"` } `json:"serviceRegistries"` Tags map[string]string `json:"tags"` - WaitUntilStable bool `json:"waitUntilStable"` - WaitUntilStableTimeout string `json:"waitUntilStableTimeout"` + TaskDefinition string `json:"taskDefinition"` + WaitUntilStable *bool `json:"waitUntilStable,omitempty"` + WaitUntilStableTimeout *string `json:"waitUntilStableTimeout,omitempty"` } // taskSetOutput defines outputs from the AWS ECS task set creation. @@ -338,20 +357,25 @@ func NewCapacityProviders(ctx *pulumi.Context, capacityProviders []CapacityProvi return fmt.Errorf("failed to register component resource: %v", err) } + var managedScaling *ecs.CapacityProviderAutoScalingGroupProviderManagedScalingArgs + if capacityProvider.AutoscalingGroupProvider.ManagedScaling != nil { + managedScaling = &ecs.CapacityProviderAutoScalingGroupProviderManagedScalingArgs{ + InstanceWarmupPeriod: pulumi.IntPtrFromPtr(capacityProvider.AutoscalingGroupProvider.ManagedScaling.InstanceWarmupPeriod), + MaximumScalingStepSize: pulumi.IntPtrFromPtr(capacityProvider.AutoscalingGroupProvider.ManagedScaling.MaximumScalingStepSize), + MinimumScalingStepSize: pulumi.IntPtrFromPtr(capacityProvider.AutoscalingGroupProvider.ManagedScaling.MinimumScalingStepSize), + Status: pulumi.StringPtrFromPtr(capacityProvider.AutoscalingGroupProvider.ManagedScaling.Status), + TargetCapacity: pulumi.IntPtrFromPtr(capacityProvider.AutoscalingGroupProvider.ManagedScaling.TargetCapacity), + } + } + _, err = ecs.NewCapacityProvider(ctx, fmt.Sprintf("capacityProvider-%d", i+1), &ecs.CapacityProviderArgs{ - Name: pulumi.String(capacityProvider.Name), AutoScalingGroupProvider: &ecs.CapacityProviderAutoScalingGroupProviderArgs{ - AutoScalingGroupArn: pulumi.String(capacityProvider.AutoscalingGroupProvider.AutoscalingGroupArn), - ManagedDraining: pulumi.String(capacityProvider.AutoscalingGroupProvider.ManagedDraining), - ManagedScaling: &ecs.CapacityProviderAutoScalingGroupProviderManagedScalingArgs{ - InstanceWarmupPeriod: pulumi.Int(capacityProvider.AutoscalingGroupProvider.ManagedScaling.InstanceWarmupPeriod), - MaximumScalingStepSize: pulumi.Int(capacityProvider.AutoscalingGroupProvider.ManagedScaling.MaximumScalingStepSize), - MinimumScalingStepSize: pulumi.Int(capacityProvider.AutoscalingGroupProvider.ManagedScaling.MinimumScalingStepSize), - Status: pulumi.String(capacityProvider.AutoscalingGroupProvider.ManagedScaling.Status), - TargetCapacity: pulumi.Int(capacityProvider.AutoscalingGroupProvider.ManagedScaling.TargetCapacity), - }, - ManagedTerminationProtection: pulumi.String(capacityProvider.AutoscalingGroupProvider.ManagedTerminationProtection), + AutoScalingGroupArn: pulumi.String(capacityProvider.AutoscalingGroupProvider.AutoscalingGroupArn), + ManagedDraining: pulumi.StringPtrFromPtr(capacityProvider.AutoscalingGroupProvider.ManagedDraining), + ManagedScaling: managedScaling, + ManagedTerminationProtection: pulumi.StringPtrFromPtr(capacityProvider.AutoscalingGroupProvider.ManagedTerminationProtection), }, + Name: pulumi.String(capacityProvider.Name), Tags: pulumi.ToStringMap(capacityProvider.Tags), }, pulumi.Parent(component)) if err != nil { @@ -370,7 +394,7 @@ func NewCluster(ctx *pulumi.Context, config ClusterConfig, opts ...pulumi.Resour return nil, fmt.Errorf("failed to register component resource: %v", err) } - settings := ecs.ClusterSettingArray{} + var settings ecs.ClusterSettingArray for _, setting := range config.Settings { settings = append(settings, &ecs.ClusterSettingArgs{ Name: pulumi.String(setting.Name), @@ -378,26 +402,40 @@ func NewCluster(ctx *pulumi.Context, config ClusterConfig, opts ...pulumi.Resour }) } - cluster, err := ecs.NewCluster(ctx, "cluster", &ecs.ClusterArgs{ - Name: pulumi.String(config.Name), - Configuration: &ecs.ClusterConfigurationArgs{ + var configuration *ecs.ClusterConfigurationArgs + if config.Configuration != nil { + var logConfiguration *ecs.ClusterConfigurationExecuteCommandConfigurationLogConfigurationArgs + if config.Configuration.ExecuteCommand.LogConfiguration != nil { + logConfiguration = &ecs.ClusterConfigurationExecuteCommandConfigurationLogConfigurationArgs{ + CloudWatchEncryptionEnabled: pulumi.BoolPtrFromPtr(config.Configuration.ExecuteCommand.LogConfiguration.CloudWatchEncryptionEnabled), + CloudWatchLogGroupName: pulumi.StringPtrFromPtr(config.Configuration.ExecuteCommand.LogConfiguration.CloudWatchLogGroupName), + S3BucketEncryptionEnabled: pulumi.BoolPtrFromPtr(config.Configuration.ExecuteCommand.LogConfiguration.S3BucketEncryptionEnabled), + S3BucketName: pulumi.StringPtrFromPtr(config.Configuration.ExecuteCommand.LogConfiguration.S3BucketName), + S3KeyPrefix: pulumi.StringPtrFromPtr(config.Configuration.ExecuteCommand.LogConfiguration.S3KeyPrefix), + } + } + configuration = &ecs.ClusterConfigurationArgs{ ExecuteCommandConfiguration: &ecs.ClusterConfigurationExecuteCommandConfigurationArgs{ - KmsKeyId: pulumi.String(config.Configuration.ExecuteCommand.KmsKeyID), - Logging: pulumi.String(config.Configuration.ExecuteCommand.Logging), - LogConfiguration: &ecs.ClusterConfigurationExecuteCommandConfigurationLogConfigurationArgs{ - CloudWatchEncryptionEnabled: pulumi.Bool(config.Configuration.LogConfiguration.CloudWatchEncryptionEnabled), - CloudWatchLogGroupName: pulumi.String(config.Configuration.LogConfiguration.CloudWatchLogGroupName), - S3BucketEncryptionEnabled: pulumi.Bool(config.Configuration.LogConfiguration.S3BucketEncryptionEnabled), - S3BucketName: pulumi.String(config.Configuration.LogConfiguration.S3BucketName), - S3KeyPrefix: pulumi.String(config.Configuration.LogConfiguration.S3KeyPrefix), - }, + KmsKeyId: pulumi.StringPtrFromPtr(config.Configuration.ExecuteCommand.KmsKeyID), + LogConfiguration: logConfiguration, + Logging: pulumi.StringPtrFromPtr(config.Configuration.ExecuteCommand.Logging), }, - }, - Settings: settings, - ServiceConnectDefaults: &ecs.ClusterServiceConnectDefaultsArgs{ - Namespace: pulumi.String(config.ServiceConnectNamespace), - }, - Tags: pulumi.ToStringMap(config.Tags), + } + } + + var serviceConnectDefaults *ecs.ClusterServiceConnectDefaultsArgs + if config.ServiceConnectDefaults != nil { + serviceConnectDefaults = &ecs.ClusterServiceConnectDefaultsArgs{ + Namespace: pulumi.String(config.ServiceConnectDefaults.Namespace), + } + } + + cluster, err := ecs.NewCluster(ctx, "cluster", &ecs.ClusterArgs{ + Configuration: configuration, + Name: pulumi.String(config.Name), + ServiceConnectDefaults: serviceConnectDefaults, + Settings: settings, + Tags: pulumi.ToStringMap(config.Tags), }, pulumi.Parent(component)) if err != nil { return nil, fmt.Errorf("failed to create new cluster: %v", err) @@ -420,15 +458,15 @@ func NewClusterCapacityProvider(ctx *pulumi.Context, config ClusterCapacityProvi var defaultCapacityProviderStrategies ecs.ClusterCapacityProvidersDefaultCapacityProviderStrategyArray for _, defaultCapacityProviderStrategy := range config.DefaultCapacityProviderStrategies { defaultCapacityProviderStrategies = append(defaultCapacityProviderStrategies, &ecs.ClusterCapacityProvidersDefaultCapacityProviderStrategyArgs{ - Base: pulumi.Int(defaultCapacityProviderStrategy.Base), + Base: pulumi.IntPtrFromPtr(defaultCapacityProviderStrategy.Base), CapacityProvider: pulumi.String(defaultCapacityProviderStrategy.CapacityProvider), - Weight: pulumi.Int(defaultCapacityProviderStrategy.Weight), + Weight: pulumi.IntPtrFromPtr(defaultCapacityProviderStrategy.Weight), }) } _, err = ecs.NewClusterCapacityProviders(ctx, "clusterCapacityProviders", &ecs.ClusterCapacityProvidersArgs{ - ClusterName: pulumi.String(config.ClusterName), CapacityProviders: pulumi.ToStringArray(config.CapacityProviders), + ClusterName: pulumi.String(config.ClusterName), DefaultCapacityProviderStrategies: defaultCapacityProviderStrategies, }, pulumi.Parent(component)) if err != nil { @@ -438,6 +476,78 @@ func NewClusterCapacityProvider(ctx *pulumi.Context, config ClusterCapacityProvi return nil } +func createServiceConnectConfiguration(config ServiceConfig) *ecs.ServiceServiceConnectConfigurationArgs { + var serviceConnectConfiguration *ecs.ServiceServiceConnectConfigurationArgs + if config.ServiceConnectConfiguration != nil { + var serviceConnectServicesLogConfiguration *ecs.ServiceServiceConnectConfigurationLogConfigurationArgs + var serviceConnectLogsSecretOptions ecs.ServiceServiceConnectConfigurationLogConfigurationSecretOptionArray + if config.ServiceConnectConfiguration.LogConfiguration != nil { + for _, serviceConnectLogsSecretOption := range config.ServiceConnectConfiguration.LogConfiguration.SecretOptions { + serviceConnectLogsSecretOptions = append(serviceConnectLogsSecretOptions, &ecs.ServiceServiceConnectConfigurationLogConfigurationSecretOptionArgs{ + Name: pulumi.String(serviceConnectLogsSecretOption.Name), + ValueFrom: pulumi.String(serviceConnectLogsSecretOption.ValueFrom), + }) + } + + serviceConnectServicesLogConfiguration = &ecs.ServiceServiceConnectConfigurationLogConfigurationArgs{ + LogDriver: pulumi.String(config.ServiceConnectConfiguration.LogConfiguration.LogDriver), + Options: pulumi.ToStringMap(config.ServiceConnectConfiguration.LogConfiguration.Options), + SecretOptions: serviceConnectLogsSecretOptions, + } + } + + var serviceConnectServicesClientAliases ecs.ServiceServiceConnectConfigurationServiceClientAliasArray + for _, service := range config.ServiceConnectConfiguration.Services { + for _, clientAlias := range service.ClientAlias { + serviceConnectServicesClientAliases = append(serviceConnectServicesClientAliases, &ecs.ServiceServiceConnectConfigurationServiceClientAliasArgs{ + DnsName: pulumi.String(clientAlias.DNSName), + Port: pulumi.Int(clientAlias.Port), + }) + } + } + + var serviceConnectServices ecs.ServiceServiceConnectConfigurationServiceArray + for _, serviceConnectService := range config.ServiceConnectConfiguration.Services { + var timeout *ecs.ServiceServiceConnectConfigurationServiceTimeoutArgs + if serviceConnectService.Timeout != nil { + timeout = &ecs.ServiceServiceConnectConfigurationServiceTimeoutArgs{ + IdleTimeoutSeconds: pulumi.IntPtrFromPtr(serviceConnectService.Timeout.IdleTimeoutSeconds), + PerRequestTimeoutSeconds: pulumi.IntPtrFromPtr(serviceConnectService.Timeout.PerRequestTimeoutSeconds), + } + } + + var tls *ecs.ServiceServiceConnectConfigurationServiceTlsArgs + if serviceConnectService.TLS != nil { + tls = &ecs.ServiceServiceConnectConfigurationServiceTlsArgs{ + IssuerCertAuthority: &ecs.ServiceServiceConnectConfigurationServiceTlsIssuerCertAuthorityArgs{ + AwsPcaAuthorityArn: pulumi.String(serviceConnectService.TLS.IssuerCertAuthority.AwsPcaAuthorityArn), + }, + KmsKey: pulumi.StringPtrFromPtr(serviceConnectService.TLS.KmsKey), + RoleArn: pulumi.StringPtrFromPtr(serviceConnectService.TLS.RoleArn), + } + } + + serviceConnectServices = append(serviceConnectServices, &ecs.ServiceServiceConnectConfigurationServiceArgs{ + ClientAlias: serviceConnectServicesClientAliases, + DiscoveryName: pulumi.StringPtrFromPtr(serviceConnectService.DiscoveryName), + IngressPortOverride: pulumi.IntPtrFromPtr(serviceConnectService.IngressPortOverride), + PortName: pulumi.String(serviceConnectService.PortName), + Timeout: timeout, + Tls: tls, + }) + } + + serviceConnectConfiguration = &ecs.ServiceServiceConnectConfigurationArgs{ + Enabled: pulumi.Bool(config.ServiceConnectConfiguration.Enabled), + LogConfiguration: serviceConnectServicesLogConfiguration, + Namespace: pulumi.StringPtrFromPtr(config.ServiceConnectConfiguration.Namespace), + Services: serviceConnectServices, + } + } + + return serviceConnectConfiguration +} + // NewService creates a new AWS ECS service. func NewService(ctx *pulumi.Context, config ServiceConfig, opts ...pulumi.ResourceOption) (*serviceOutput, error) { component := &pulumi.ResourceState{} @@ -447,7 +557,7 @@ func NewService(ctx *pulumi.Context, config ServiceConfig, opts ...pulumi.Resour } var alarms *ecs.ServiceAlarmsArgs - if len(config.Alarms.AlarmNames) != 0 { + if config.Alarms != nil { alarms = &ecs.ServiceAlarmsArgs{ AlarmNames: pulumi.ToStringArray(config.Alarms.AlarmNames), Enable: pulumi.Bool(config.Alarms.Enable), @@ -458,139 +568,122 @@ func NewService(ctx *pulumi.Context, config ServiceConfig, opts ...pulumi.Resour var capacityProviderStrategies ecs.ServiceCapacityProviderStrategyArray for _, capacityProviderStrategy := range config.CapacityProviderStrategies { capacityProviderStrategies = append(capacityProviderStrategies, &ecs.ServiceCapacityProviderStrategyArgs{ - CapacityProvider: pulumi.String(capacityProviderStrategy.Name), - Base: pulumi.Int(capacityProviderStrategy.Base), - Weight: pulumi.Int(capacityProviderStrategy.Weight), + CapacityProvider: pulumi.String(capacityProviderStrategy.CapacityProvider), + Base: pulumi.IntPtrFromPtr(capacityProviderStrategy.Base), + Weight: pulumi.IntPtrFromPtr(capacityProviderStrategy.Weight), }) } + var deploymentCircuitBreaker *ecs.ServiceDeploymentCircuitBreakerArgs + if config.DeploymentCircuitBreaker != nil { + deploymentCircuitBreaker = &ecs.ServiceDeploymentCircuitBreakerArgs{ + Enable: pulumi.Bool(config.DeploymentCircuitBreaker.Enable), + Rollback: pulumi.Bool(config.DeploymentCircuitBreaker.Rollback), + } + } + + var deploymentController *ecs.ServiceDeploymentControllerArgs + if config.DeploymentController != nil { + deploymentController = &ecs.ServiceDeploymentControllerArgs{ + Type: pulumi.StringPtrFromPtr(config.DeploymentController.Type), + } + } + var loadBalancers ecs.ServiceLoadBalancerArray for _, loadBalancer := range config.LoadBalancers { loadBalancers = append(loadBalancers, &ecs.ServiceLoadBalancerArgs{ ContainerName: pulumi.String(loadBalancer.ContainerName), ContainerPort: pulumi.Int(loadBalancer.ContainerPort), - ElbName: pulumi.String(loadBalancer.ElbName), - TargetGroupArn: pulumi.String(loadBalancer.TargetGroupArn), + ElbName: pulumi.StringPtrFromPtr(loadBalancer.ElbName), + TargetGroupArn: pulumi.StringPtrFromPtr(loadBalancer.TargetGroupArn), }) } + var networkConfiguration *ecs.ServiceNetworkConfigurationArgs + if config.NetworkConfiguration != nil { + networkConfiguration = &ecs.ServiceNetworkConfigurationArgs{ + AssignPublicIp: pulumi.BoolPtrFromPtr(config.NetworkConfiguration.AssignPublicIP), + SecurityGroups: pulumi.ToStringArray(config.NetworkConfiguration.SecurityGroups), + Subnets: pulumi.ToStringArray(config.NetworkConfiguration.Subnets), + } + } + var orderedPlacementStrategies ecs.ServiceOrderedPlacementStrategyArray for _, orderedPlacementStrategy := range config.OrderedPlacementStrategies { orderedPlacementStrategies = append(orderedPlacementStrategies, &ecs.ServiceOrderedPlacementStrategyArgs{ + Field: pulumi.StringPtrFromPtr(orderedPlacementStrategy.Field), Type: pulumi.String(orderedPlacementStrategy.Type), - Field: pulumi.String(orderedPlacementStrategy.Field), }) } var placementConstraints ecs.ServicePlacementConstraintArray for _, placementConstraint := range config.PlacementConstraints { placementConstraints = append(placementConstraints, &ecs.ServicePlacementConstraintArgs{ + Expression: pulumi.StringPtrFromPtr(placementConstraint.Expression), Type: pulumi.String(placementConstraint.Type), - Expression: pulumi.String(placementConstraint.Expression), }) } var serviceRegistries *ecs.ServiceServiceRegistriesArgs - if config.ServiceRegistry.RegistryArn != "" { + if config.ServiceRegistry != nil { serviceRegistries = &ecs.ServiceServiceRegistriesArgs{ - ContainerName: pulumi.String(config.ServiceRegistry.ContainerName), - ContainerPort: pulumi.Int(config.ServiceRegistry.ContainerPort), - Port: pulumi.Int(config.ServiceRegistry.Port), + ContainerName: pulumi.StringPtrFromPtr(config.ServiceRegistry.ContainerName), + ContainerPort: pulumi.IntPtrFromPtr(config.ServiceRegistry.ContainerPort), + Port: pulumi.IntPtrFromPtr(config.ServiceRegistry.Port), RegistryArn: pulumi.String(config.ServiceRegistry.RegistryArn), } } - var serviceConnectServicesLogConfiguration *ecs.ServiceServiceConnectConfigurationLogConfigurationArgs - var serviceConnectLogsSecretOptions ecs.ServiceServiceConnectConfigurationLogConfigurationSecretOptionArray - if config.ServiceConnectConfiguration.LogConfiguration.LogDriver != "" { - for _, serviceConnectLogsSecretOption := range config.ServiceConnectConfiguration.LogConfiguration.SecretOptions { - serviceConnectLogsSecretOptions = append(serviceConnectLogsSecretOptions, &ecs.ServiceServiceConnectConfigurationLogConfigurationSecretOptionArgs{ - Name: pulumi.String(serviceConnectLogsSecretOption.Name), - ValueFrom: pulumi.String(serviceConnectLogsSecretOption.ValueFrom), - }) - } - - serviceConnectServicesLogConfiguration = &ecs.ServiceServiceConnectConfigurationLogConfigurationArgs{ - LogDriver: pulumi.String(config.ServiceConnectConfiguration.LogConfiguration.LogDriver), - Options: pulumi.ToStringMap(config.ServiceConnectConfiguration.LogConfiguration.Options), - SecretOptions: serviceConnectLogsSecretOptions, - } - } - - var serviceConnectServicesClientAliases ecs.ServiceServiceConnectConfigurationServiceClientAliasArray - for _, service := range config.ServiceConnectConfiguration.Services { - for _, clientAlias := range service.ClientAlias { - serviceConnectServicesClientAliases = append(serviceConnectServicesClientAliases, &ecs.ServiceServiceConnectConfigurationServiceClientAliasArgs{ - Port: pulumi.Int(clientAlias.Port), - DnsName: pulumi.String(clientAlias.DNSName), - }) - } - } - - var serviceConnectServices ecs.ServiceServiceConnectConfigurationServiceArray - for _, serviceConnectService := range config.ServiceConnectConfiguration.Services { - serviceConnectServices = append(serviceConnectServices, &ecs.ServiceServiceConnectConfigurationServiceArgs{ - PortName: pulumi.String(serviceConnectService.PortName), - ClientAlias: serviceConnectServicesClientAliases, - DiscoveryName: pulumi.String(serviceConnectService.DiscoveryName), - IngressPortOverride: pulumi.Int(serviceConnectService.IngressPortOverride), - Timeout: &ecs.ServiceServiceConnectConfigurationServiceTimeoutArgs{ - IdleTimeoutSeconds: pulumi.Int(serviceConnectService.Timeout.IdleTimeoutSeconds), - PerRequestTimeoutSeconds: pulumi.Int(serviceConnectService.Timeout.PerRequestTimeoutSeconds), + serviceConnectConfiguration := createServiceConnectConfiguration(config) + + var serviceVolumeConfiguration *ecs.ServiceVolumeConfigurationArgs + if config.ServiceVolumeConfiguration != nil { + serviceVolumeConfiguration = &ecs.ServiceVolumeConfigurationArgs{ + ManagedEbsVolume: &ecs.ServiceVolumeConfigurationManagedEbsVolumeArgs{ + Encrypted: pulumi.BoolPtrFromPtr(config.ServiceVolumeConfiguration.ManagedEBSVolume.Encrypted), + FileSystemType: pulumi.StringPtrFromPtr(config.ServiceVolumeConfiguration.ManagedEBSVolume.FileSystemType), + Iops: pulumi.IntPtrFromPtr(config.ServiceVolumeConfiguration.ManagedEBSVolume.Iops), + KmsKeyId: pulumi.StringPtrFromPtr(config.ServiceVolumeConfiguration.ManagedEBSVolume.KmsKeyID), + RoleArn: pulumi.String(config.ServiceVolumeConfiguration.ManagedEBSVolume.RoleArn), + SizeInGb: pulumi.IntPtrFromPtr(config.ServiceVolumeConfiguration.ManagedEBSVolume.SizeInGB), + SnapshotId: pulumi.StringPtrFromPtr(config.ServiceVolumeConfiguration.ManagedEBSVolume.SnapshotID), + Throughput: pulumi.StringPtrFromPtr(config.ServiceVolumeConfiguration.ManagedEBSVolume.Throughput), + VolumeType: pulumi.StringPtrFromPtr(config.ServiceVolumeConfiguration.ManagedEBSVolume.VolumeType), }, - Tls: &ecs.ServiceServiceConnectConfigurationServiceTlsArgs{ - IssuerCertAuthority: &ecs.ServiceServiceConnectConfigurationServiceTlsIssuerCertAuthorityArgs{ - AwsPcaAuthorityArn: pulumi.String(serviceConnectService.TLS.IssuerCertAuthority.AwsPcaAuthorityArn), - }, - KmsKey: pulumi.String(serviceConnectService.TLS.KmsKey), - RoleArn: pulumi.String(serviceConnectService.TLS.RoleArn), - }, - }) + Name: pulumi.String(config.ServiceVolumeConfiguration.Name), + } } service, err := ecs.NewService(ctx, "service", &ecs.ServiceArgs{ - Name: pulumi.String(config.Name), - Cluster: pulumi.String(config.ClusterArn), - TaskDefinition: pulumi.String(config.TaskDefinition), - DesiredCount: pulumi.Int(config.DesiredCount), - Alarms: alarms, - CapacityProviderStrategies: capacityProviderStrategies, - DeploymentCircuitBreaker: &ecs.ServiceDeploymentCircuitBreakerArgs{ - Enable: pulumi.Bool(config.DeploymentCircuitBreaker.Enable), - Rollback: pulumi.Bool(config.DeploymentCircuitBreaker.Rollback), - }, - DeploymentController: &ecs.ServiceDeploymentControllerArgs{ - Type: pulumi.String(config.DeploymentController.Type), - }, - DeploymentMaximumPercent: pulumi.Int(config.DeploymentMaximumPercent), - DeploymentMinimumHealthyPercent: pulumi.Int(config.DeploymentMinimumHealthyPercent), - EnableEcsManagedTags: pulumi.Bool(config.EnableEcsManagedTags), - EnableExecuteCommand: pulumi.Bool(config.EnableExecuteCommand), - ForceNewDeployment: pulumi.Bool(config.ForceNewDeployment), - HealthCheckGracePeriodSeconds: pulumi.Int(config.HealthCheckGracePeriodSeconds), - IamRole: pulumi.String(config.IamRole), - LaunchType: pulumi.String(config.LaunchType), + Alarms: alarms, + CapacityProviderStrategies: capacityProviderStrategies, + Cluster: pulumi.String(config.ClusterArn), + DeploymentCircuitBreaker: deploymentCircuitBreaker, + DeploymentController: deploymentController, + DeploymentMaximumPercent: pulumi.IntPtrFromPtr(config.DeploymentMaximumPercent), + DeploymentMinimumHealthyPercent: pulumi.IntPtrFromPtr(config.DeploymentMinimumHealthyPercent), + DesiredCount: pulumi.IntPtrFromPtr(config.DesiredCount), + EnableEcsManagedTags: pulumi.BoolPtrFromPtr(config.EnableEcsManagedTags), + EnableExecuteCommand: pulumi.BoolPtrFromPtr(config.EnableExecuteCommand), + ForceNewDeployment: pulumi.BoolPtrFromPtr(config.ForceNewDeployment), + HealthCheckGracePeriodSeconds: pulumi.IntPtrFromPtr(config.HealthCheckGracePeriodSeconds), + IamRole: pulumi.StringPtrFromPtr(config.IamRole), + LaunchType: pulumi.StringPtrFromPtr(config.LaunchType), LoadBalancers: loadBalancers, - NetworkConfiguration: &ecs.ServiceNetworkConfigurationArgs{ - Subnets: pulumi.ToStringArray(config.NetworkConfiguration.Subnets), - AssignPublicIp: pulumi.Bool(config.NetworkConfiguration.AssignPublicIP), - SecurityGroups: pulumi.ToStringArray(config.NetworkConfiguration.SecurityGroups), - }, - OrderedPlacementStrategies: orderedPlacementStrategies, - PlacementConstraints: placementConstraints, - PlatformVersion: pulumi.String(config.PlatformVersion), - PropagateTags: pulumi.String(config.PropagateTags), - SchedulingStrategy: pulumi.String(config.SchedulingStrategy), - ServiceConnectConfiguration: &ecs.ServiceServiceConnectConfigurationArgs{ - Enabled: pulumi.Bool(config.ServiceConnectConfiguration.Enabled), - LogConfiguration: serviceConnectServicesLogConfiguration, - Namespace: pulumi.String(config.ServiceConnectConfiguration.Namespace), - Services: serviceConnectServices, - }, - ServiceRegistries: serviceRegistries, - Tags: pulumi.ToStringMap(config.Tags), - Triggers: pulumi.ToStringMap(config.Triggers), - WaitForSteadyState: pulumi.Bool(config.WaitForSteadyState), + Name: pulumi.String(config.Name), + NetworkConfiguration: networkConfiguration, + OrderedPlacementStrategies: orderedPlacementStrategies, + PlacementConstraints: placementConstraints, + PlatformVersion: pulumi.StringPtrFromPtr(config.PlatformVersion), + PropagateTags: pulumi.StringPtrFromPtr(config.PropagateTags), + SchedulingStrategy: pulumi.StringPtrFromPtr(config.SchedulingStrategy), + ServiceConnectConfiguration: serviceConnectConfiguration, + ServiceRegistries: serviceRegistries, + Tags: pulumi.ToStringMap(config.Tags), + TaskDefinition: pulumi.StringPtrFromPtr(config.TaskDefinition), + Triggers: pulumi.ToStringMap(config.Triggers), + VolumeConfiguration: serviceVolumeConfiguration, + WaitForSteadyState: pulumi.BoolPtrFromPtr(config.WaitForSteadyState), }, pulumi.Parent(component)) if err != nil { return nil, fmt.Errorf("failed to create new service: %v", err) @@ -614,6 +707,13 @@ func NewTaskDefinition(ctx *pulumi.Context, config TaskDefinitionConfig, opts .. return nil, fmt.Errorf("could not marshal container definitions json: %v", err) } + var ephemeralStorage *ecs.TaskDefinitionEphemeralStorageArgs + if config.EphemeralStorage != nil { + ephemeralStorage = &ecs.TaskDefinitionEphemeralStorageArgs{ + SizeInGib: pulumi.Int(config.EphemeralStorage.SizeInGB), + } + } + var inferenceAccelerators ecs.TaskDefinitionInferenceAcceleratorArray for _, inferenceAccelerator := range config.InferenceAccelerators { inferenceAccelerators = append(inferenceAccelerators, &ecs.TaskDefinitionInferenceAcceleratorArgs{ @@ -622,57 +722,65 @@ func NewTaskDefinition(ctx *pulumi.Context, config TaskDefinitionConfig, opts .. }) } - var ipcMode pulumi.StringPtrInput - if config.IpcMode != "" { - ipcMode = pulumi.String(config.IpcMode) + var placementConstraints ecs.TaskDefinitionPlacementConstraintArray + for _, placementConstraint := range config.PlacementConstraints { + placementConstraints = append(placementConstraints, &ecs.TaskDefinitionPlacementConstraintArgs{ + Expression: pulumi.StringPtrFromPtr(placementConstraint.Expression), + Type: pulumi.String(placementConstraint.Type), + }) } var proxyConfiguration *ecs.TaskDefinitionProxyConfigurationArgs - if config.ProxyConfiguration.Type != "" { + if config.ProxyConfiguration != nil { proxyConfiguration = &ecs.TaskDefinitionProxyConfigurationArgs{ ContainerName: pulumi.String(config.ProxyConfiguration.ContainerName), Properties: pulumi.ToStringMap(config.ProxyConfiguration.Properties), - Type: pulumi.String(config.ProxyConfiguration.Type), + Type: pulumi.StringPtrFromPtr(config.ProxyConfiguration.Type), } } - var placementConstraints ecs.TaskDefinitionPlacementConstraintArray - for _, placementConstraint := range config.PlacementConstraints { - placementConstraints = append(placementConstraints, &ecs.TaskDefinitionPlacementConstraintArgs{ - Expression: pulumi.String(placementConstraint.Expression), - Type: pulumi.String(placementConstraint.Type), - }) + var runtimePlatform *ecs.TaskDefinitionRuntimePlatformArgs + if config.RuntimePlatform != nil { + runtimePlatform = &ecs.TaskDefinitionRuntimePlatformArgs{ + CpuArchitecture: pulumi.StringPtrFromPtr(config.RuntimePlatform.CPUArchitecture), + OperatingSystemFamily: pulumi.StringPtrFromPtr(config.RuntimePlatform.OperatingSystemFamily), + } } var volumes ecs.TaskDefinitionVolumeArray for _, volume := range config.Volumes { var dockerVolumeConfiguration *ecs.TaskDefinitionVolumeDockerVolumeConfigurationArgs - if volume.DockerVolumeConfiguration.Scope != "" { + if volume.DockerVolumeConfiguration != nil { dockerVolumeConfiguration = &ecs.TaskDefinitionVolumeDockerVolumeConfigurationArgs{ - Autoprovision: pulumi.Bool(volume.DockerVolumeConfiguration.Autoprovision), - Driver: pulumi.String(volume.DockerVolumeConfiguration.Driver), + Autoprovision: pulumi.BoolPtrFromPtr(volume.DockerVolumeConfiguration.Autoprovision), + Driver: pulumi.StringPtrFromPtr(volume.DockerVolumeConfiguration.Driver), DriverOpts: pulumi.ToStringMap(volume.DockerVolumeConfiguration.DriverOpts), Labels: pulumi.ToStringMap(volume.DockerVolumeConfiguration.Labels), - Scope: pulumi.String(volume.DockerVolumeConfiguration.Scope), + Scope: pulumi.StringPtrFromPtr(volume.DockerVolumeConfiguration.Scope), } } var efsVolumeConfiguration *ecs.TaskDefinitionVolumeEfsVolumeConfigurationArgs - if volume.EfsVolumeConfiguration.FileSystemID != "" { + if volume.EfsVolumeConfiguration != nil { + var authorizationConfig *ecs.TaskDefinitionVolumeEfsVolumeConfigurationAuthorizationConfigArgs + if volume.EfsVolumeConfiguration.AuthorizationConfig != nil { + authorizationConfig = &ecs.TaskDefinitionVolumeEfsVolumeConfigurationAuthorizationConfigArgs{ + AccessPointId: pulumi.StringPtrFromPtr(volume.EfsVolumeConfiguration.AuthorizationConfig.AccessPointID), + Iam: pulumi.StringPtrFromPtr(volume.EfsVolumeConfiguration.AuthorizationConfig.Iam), + } + } + efsVolumeConfiguration = &ecs.TaskDefinitionVolumeEfsVolumeConfigurationArgs{ - FileSystemId: pulumi.String(volume.EfsVolumeConfiguration.FileSystemID), - AuthorizationConfig: &ecs.TaskDefinitionVolumeEfsVolumeConfigurationAuthorizationConfigArgs{ - AccessPointId: pulumi.String(volume.EfsVolumeConfiguration.AuthorizationConfig.AccessPointID), - Iam: pulumi.String(volume.EfsVolumeConfiguration.AuthorizationConfig.Iam), - }, - RootDirectory: pulumi.String(volume.EfsVolumeConfiguration.RootDirectory), - TransitEncryption: pulumi.String(volume.EfsVolumeConfiguration.TransitEncryption), - TransitEncryptionPort: pulumi.Int(volume.EfsVolumeConfiguration.TransitEncryptionPort), + AuthorizationConfig: authorizationConfig, + FileSystemId: pulumi.String(volume.EfsVolumeConfiguration.FileSystemID), + RootDirectory: pulumi.StringPtrFromPtr(volume.EfsVolumeConfiguration.RootDirectory), + TransitEncryption: pulumi.StringPtrFromPtr(volume.EfsVolumeConfiguration.TransitEncryption), + TransitEncryptionPort: pulumi.IntPtrFromPtr(volume.EfsVolumeConfiguration.TransitEncryptionPort), } } var fsxVolumeConfiguration *ecs.TaskDefinitionVolumeFsxWindowsFileServerVolumeConfigurationArgs - if volume.FsxWindowsFileServerVolumeConfiguration.FileSystemID != "" { + if volume.FsxWindowsFileServerVolumeConfiguration != nil { fsxVolumeConfiguration = &ecs.TaskDefinitionVolumeFsxWindowsFileServerVolumeConfigurationArgs{ AuthorizationConfig: &ecs.TaskDefinitionVolumeFsxWindowsFileServerVolumeConfigurationAuthorizationConfigArgs{ CredentialsParameter: pulumi.String(volume.FsxWindowsFileServerVolumeConfiguration.AuthorizationConfig.CredentialsParameter), @@ -684,39 +792,34 @@ func NewTaskDefinition(ctx *pulumi.Context, config TaskDefinitionConfig, opts .. } volumes = append(volumes, &ecs.TaskDefinitionVolumeArgs{ - Name: pulumi.String(volume.Name), DockerVolumeConfiguration: dockerVolumeConfiguration, EfsVolumeConfiguration: efsVolumeConfiguration, FsxWindowsFileServerVolumeConfiguration: fsxVolumeConfiguration, - HostPath: pulumi.String(volume.HostPath), + HostPath: pulumi.StringPtrFromPtr(volume.HostPath), + Name: pulumi.String(volume.Name), }) } taskDefinition, err := ecs.NewTaskDefinition(ctx, "taskDefinition", &ecs.TaskDefinitionArgs{ - Family: pulumi.String(config.Name), - ContainerDefinitions: pulumi.String(containerDefinitions), - NetworkMode: pulumi.String(config.NetworkMode), - Cpu: pulumi.String(config.CPU), - EphemeralStorage: &ecs.TaskDefinitionEphemeralStorageArgs{ - SizeInGib: pulumi.Int(config.EphemeralStorage), - }, - ExecutionRoleArn: pulumi.String(config.ExecutionRoleArn), - IpcMode: ipcMode, + ContainerDefinitions: pulumi.String(containerDefinitions), + Cpu: pulumi.StringPtrFromPtr(config.CPU), + EphemeralStorage: ephemeralStorage, + ExecutionRoleArn: pulumi.StringPtrFromPtr(config.ExecutionRoleArn), + Family: pulumi.String(config.Name), + IpcMode: pulumi.StringPtrFromPtr(config.IpcMode), InferenceAccelerators: inferenceAccelerators, - Memory: pulumi.String(config.Memory), - PidMode: pulumi.String(config.PidMode), + Memory: pulumi.StringPtrFromPtr(config.Memory), + NetworkMode: pulumi.StringPtrFromPtr(config.NetworkMode), + PidMode: pulumi.StringPtrFromPtr(config.PidMode), PlacementConstraints: placementConstraints, ProxyConfiguration: proxyConfiguration, RequiresCompatibilities: pulumi.ToStringArray(config.RequiresCompatibilities), - RuntimePlatform: &ecs.TaskDefinitionRuntimePlatformArgs{ - CpuArchitecture: pulumi.String(config.RuntimePlatform.CPUArchitecture), - OperatingSystemFamily: pulumi.String(config.RuntimePlatform.OperatingSystemFamily), - }, - SkipDestroy: pulumi.Bool(config.SkipDestroy), - Tags: pulumi.ToStringMap(config.Tags), - TaskRoleArn: pulumi.String(config.TaskRoleArn), - TrackLatest: pulumi.Bool(config.TrackLatest), - Volumes: volumes, + RuntimePlatform: runtimePlatform, + SkipDestroy: pulumi.BoolPtrFromPtr(config.SkipDestroy), + Tags: pulumi.ToStringMap(config.Tags), + TaskRoleArn: pulumi.StringPtrFromPtr(config.TaskRoleArn), + TrackLatest: pulumi.BoolPtrFromPtr(config.TrackLatest), + Volumes: volumes, }, pulumi.Parent(component)) if err != nil { return nil, fmt.Errorf("failed to create new task definition: %v", err) @@ -738,64 +841,68 @@ func NewTaskSets(ctx *pulumi.Context, taskSets []TaskSetConfig, opts ...pulumi.R return nil, fmt.Errorf("failed to register component resource: %v", err) } + var capacityProviderStrategies ecs.TaskSetCapacityProviderStrategyArray + for _, capacityProviderStrategy := range taskSet.CapacityProviderStrategies { + capacityProviderStrategies = append(capacityProviderStrategies, &ecs.TaskSetCapacityProviderStrategyArgs{ + Base: pulumi.IntPtrFromPtr(capacityProviderStrategy.Base), + CapacityProvider: pulumi.String(capacityProviderStrategy.CapacityProvider), + Weight: pulumi.Int(capacityProviderStrategy.Weight), + }) + } + var loadBalancers ecs.TaskSetLoadBalancerArray for _, loadBalancer := range taskSet.LoadBalancers { loadBalancers = append(loadBalancers, &ecs.TaskSetLoadBalancerArgs{ ContainerName: pulumi.String(loadBalancer.ContainerName), - ContainerPort: pulumi.Int(loadBalancer.ContainerPort), - LoadBalancerName: pulumi.String(loadBalancer.LoadBalancerName), - TargetGroupArn: pulumi.String(loadBalancer.TargetGroupArn), + ContainerPort: pulumi.IntPtrFromPtr(loadBalancer.ContainerPort), + LoadBalancerName: pulumi.StringPtrFromPtr(loadBalancer.LoadBalancerName), + TargetGroupArn: pulumi.StringPtrFromPtr(loadBalancer.TargetGroupArn), }) } - var capacityProviderStrategies ecs.TaskSetCapacityProviderStrategyArray - for _, capacityProviderStrategy := range taskSet.CapacityProviderStrategies { - capacityProviderStrategies = append(capacityProviderStrategies, &ecs.TaskSetCapacityProviderStrategyArgs{ - Base: pulumi.Int(capacityProviderStrategy.Base), - CapacityProvider: pulumi.String(capacityProviderStrategy.CapacityProvider), - Weight: pulumi.Int(capacityProviderStrategy.Weight), - }) + var networkConfiguration *ecs.TaskSetNetworkConfigurationArgs + if taskSet.NetworkConfiguration != nil { + networkConfiguration = &ecs.TaskSetNetworkConfigurationArgs{ + AssignPublicIp: pulumi.BoolPtrFromPtr(taskSet.NetworkConfiguration.AssignPublicIP), + SecurityGroups: pulumi.ToStringArray(taskSet.NetworkConfiguration.SecurityGroups), + Subnets: pulumi.ToStringArray(taskSet.NetworkConfiguration.Subnets), + } + } + + var scale *ecs.TaskSetScaleArgs + if taskSet.Scale != nil { + scale = &ecs.TaskSetScaleArgs{ + Unit: pulumi.StringPtrFromPtr(taskSet.Scale.Unit), + Value: pulumi.Float64PtrFromPtr(taskSet.Scale.Value), + } } var serviceRegistries *ecs.TaskSetServiceRegistriesArgs - if taskSet.ServiceRegistries.RegistryArn != "" { + if taskSet.ServiceRegistries != nil { serviceRegistries = &ecs.TaskSetServiceRegistriesArgs{ - ContainerName: pulumi.String(taskSet.ServiceRegistries.ContainerName), - ContainerPort: pulumi.Int(taskSet.ServiceRegistries.ContainerPort), - Port: pulumi.Int(taskSet.ServiceRegistries.Port), + ContainerName: pulumi.StringPtrFromPtr(taskSet.ServiceRegistries.ContainerName), + ContainerPort: pulumi.IntPtrFromPtr(taskSet.ServiceRegistries.ContainerPort), + Port: pulumi.IntPtrFromPtr(taskSet.ServiceRegistries.Port), RegistryArn: pulumi.String(taskSet.ServiceRegistries.RegistryArn), } } - var waitUntilStableTimeout pulumi.StringPtrInput - if taskSet.WaitUntilStableTimeout != "" { - waitUntilStableTimeout = pulumi.String(taskSet.WaitUntilStableTimeout) - } - output, err := ecs.NewTaskSet(ctx, fmt.Sprintf("taskSet-%d", i+1), &ecs.TaskSetArgs{ - Service: pulumi.String(taskSet.Service), - Cluster: pulumi.String(taskSet.Cluster), - TaskDefinition: pulumi.String(taskSet.TaskDefinition), CapacityProviderStrategies: capacityProviderStrategies, - ExternalId: pulumi.String(taskSet.ExternalID), - ForceDelete: pulumi.Bool(taskSet.ForceDelete), - LaunchType: pulumi.String(taskSet.LaunchType), + Cluster: pulumi.String(taskSet.Cluster), + ExternalId: pulumi.StringPtrFromPtr(taskSet.ExternalID), + ForceDelete: pulumi.BoolPtrFromPtr(taskSet.ForceDelete), + LaunchType: pulumi.StringPtrFromPtr(taskSet.LaunchType), LoadBalancers: loadBalancers, - NetworkConfiguration: &ecs.TaskSetNetworkConfigurationArgs{ - Subnets: pulumi.ToStringArray(taskSet.NetworkConfiguration.Subnets), - AssignPublicIp: pulumi.Bool(taskSet.NetworkConfiguration.AssignPublicIP), - SecurityGroups: pulumi.ToStringArray(taskSet.NetworkConfiguration.SecurityGroups), - }, - PlatformVersion: pulumi.String(taskSet.PlatformVersion), - Scale: &ecs.TaskSetScaleArgs{ - Unit: pulumi.String(taskSet.Scale.Unit), - Value: pulumi.Float64(taskSet.Scale.Value), - }, - - ServiceRegistries: serviceRegistries, - Tags: pulumi.ToStringMap(taskSet.Tags), - WaitUntilStable: pulumi.Bool(taskSet.WaitUntilStable), - WaitUntilStableTimeout: waitUntilStableTimeout, + NetworkConfiguration: networkConfiguration, + PlatformVersion: pulumi.StringPtrFromPtr(taskSet.PlatformVersion), + Scale: scale, + Service: pulumi.String(taskSet.Service), + ServiceRegistries: serviceRegistries, + Tags: pulumi.ToStringMap(taskSet.Tags), + TaskDefinition: pulumi.String(taskSet.TaskDefinition), + WaitUntilStable: pulumi.BoolPtrFromPtr(taskSet.WaitUntilStable), + WaitUntilStableTimeout: pulumi.StringPtrFromPtr(taskSet.WaitUntilStableTimeout), }, pulumi.Parent(component)) if err != nil { return nil, fmt.Errorf("failed to create new task set: %v", err) diff --git a/ecs_test.go b/ecs_test.go index 88d9a68..fa12c07 100644 --- a/ecs_test.go +++ b/ecs_test.go @@ -571,8 +571,11 @@ func TestNewTaskDefinition(t *testing.T) { stack, err := auto.UpsertStackInlineSource(ctx, stackName, projectName, func(ctx *pulumi.Context) error { current, err := aws.GetCallerIdentity(ctx, nil, nil) assert.NoError(t, err) - taskDefinitionConfig.ExecutionRoleArn = strings.Replace(taskDefinitionConfig.ExecutionRoleArn, "$ACCOUNT_ID", current.AccountId, 1) - taskDefinitionConfig.TaskRoleArn = strings.Replace(taskDefinitionConfig.TaskRoleArn, "$ACCOUNT_ID", current.AccountId, 1) + executionRoleArn := strings.Replace(*taskDefinitionConfig.ExecutionRoleArn, "$ACCOUNT_ID", current.AccountId, 1) + taskDefinitionConfig.ExecutionRoleArn = &executionRoleArn + + taskDefinitionRoleArn := strings.Replace(*taskDefinitionConfig.TaskRoleArn, "$ACCOUNT_ID", current.AccountId, 1) + taskDefinitionConfig.TaskRoleArn = &taskDefinitionRoleArn _, err = NewTaskDefinition(ctx, *taskDefinitionConfig) if err != nil { diff --git a/examples/Cluster/config.json b/examples/Cluster/config.json index 063dee6..044fc7c 100644 --- a/examples/Cluster/config.json +++ b/examples/Cluster/config.json @@ -4,14 +4,14 @@ "configuration": { "executeCommand": { "kmsKeyId": "my-kms-key-id", + "logConfiguration": { + "cloudWatchEncryptionEnabled": true, + "cloudWatchLogGroupName": "/ecs/my-cluster-logs", + "s3BucketEncryptionEnabled": true, + "s3BucketName": "my-s3-bucket", + "s3KeyPrefix": "logs/" + }, "logging": "OVERRIDE" - }, - "logConfiguration": { - "cloudWatchEncryptionEnabled": true, - "cloudWatchLogGroupName": "/ecs/my-cluster-logs", - "s3BucketEncryptionEnabled": true, - "s3BucketName": "my-s3-bucket", - "s3KeyPrefix": "logs/" } }, "settings": [ diff --git a/examples/TaskDefinition/config.json b/examples/TaskDefinition/config.json index 0834d3b..c0204c4 100644 --- a/examples/TaskDefinition/config.json +++ b/examples/TaskDefinition/config.json @@ -15,7 +15,9 @@ ], "networkMode": "awsvpc", "cpu": "256", - "ephemeralStorage": 30, + "ephemeralStorage": { + "sizeInGb": 30 + }, "executionRoleArn": "arn:aws:iam::$ACCOUNT_ID:role/aws-service-role/ecs.amazonaws.com/AWSServiceRoleForECS", "memory": "512", "pidMode": "task", diff --git a/go.mod b/go.mod index 9d854ba..0484a2f 100644 --- a/go.mod +++ b/go.mod @@ -82,15 +82,15 @@ require ( github.com/zclconf/go-cty v1.13.2 // indirect go.uber.org/atomic v1.9.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.23.0 // indirect + golang.org/x/crypto v0.24.0 // indirect golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect - golang.org/x/mod v0.17.0 // indirect - golang.org/x/net v0.25.0 // indirect + golang.org/x/mod v0.18.0 // indirect + golang.org/x/net v0.26.0 // indirect golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/term v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - golang.org/x/tools v0.21.0 // indirect + golang.org/x/sys v0.21.0 // indirect + golang.org/x/term v0.21.0 // indirect + golang.org/x/text v0.16.0 // indirect + golang.org/x/tools v0.22.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240311173647-c811ad7063a7 // indirect google.golang.org/grpc v1.63.2 // indirect google.golang.org/protobuf v1.34.0 // indirect diff --git a/go.sum b/go.sum index 0007eea..c1345c1 100644 --- a/go.sum +++ b/go.sum @@ -219,8 +219,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= +golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= @@ -229,8 +229,8 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0= +golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -242,8 +242,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= +golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -273,15 +273,15 @@ golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= -golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA= +golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -289,8 +289,8 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -299,8 +299,8 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.21.0 h1:qc0xYgIbsSDt9EyWz05J5wfa7LOVW0YTLOXrqdLAWIw= -golang.org/x/tools v0.21.0/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA= +golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=