Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 54 additions & 0 deletions cmd/ctrlc/root/api/upsert/policy/policy.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,52 @@ import (
"github.com/spf13/viper"
)

func parseEnvironmentVersionRollout(rollout string) (*api.InsertEnvironmentVersionRollout, error) {
if rollout == "" {
return nil, nil
}

var selector map[string]any
if err := json.Unmarshal([]byte(rollout), &selector); err != nil {
return nil, fmt.Errorf("invalid environment version rollout JSON: %w", err)
}

var parsedRolloutType *api.InsertEnvironmentVersionRolloutRolloutType
if selector["rolloutType"] != nil {
rolloutTypeString, ok := selector["rolloutType"].(string)
if !ok {
return nil, fmt.Errorf("invalid rollout type: %v", selector["rolloutType"])
}
castedRollout := api.InsertEnvironmentVersionRolloutRolloutType(rolloutTypeString)
parsedRolloutType = &castedRollout
}

var parsedPositionGrowthFactor *float32
if selector["positionGrowthFactor"] != nil {
float64PositionGrowthFactor, ok := selector["positionGrowthFactor"].(float64)
if !ok {
return nil, fmt.Errorf("invalid position growth factor: %v", selector["positionGrowthFactor"])
}
float32PositionGrowthFactor := float32(float64PositionGrowthFactor)
parsedPositionGrowthFactor = &float32PositionGrowthFactor
}

var parsedTimeScaleInterval float32
if selector["timeScaleInterval"] != nil {
float64TimeScaleInterval, ok := selector["timeScaleInterval"].(float64)
if !ok {
return nil, fmt.Errorf("invalid time scale interval: %v", selector["timeScaleInterval"])
}
parsedTimeScaleInterval = float32(float64TimeScaleInterval)
}

return &api.InsertEnvironmentVersionRollout{
PositionGrowthFactor: parsedPositionGrowthFactor,
TimeScaleInterval: parsedTimeScaleInterval,
RolloutType: parsedRolloutType,
}, nil
}

func NewUpsertPolicyCmd() *cobra.Command {
var name string
var description string
Expand All @@ -21,6 +67,7 @@ func NewUpsertPolicyCmd() *cobra.Command {
var resourceTargetSelector string
var deploymentVersionSelector string
var concurrency int
var environmentVersionRollout string

cmd := &cobra.Command{
Use: "policy [flags]",
Expand Down Expand Up @@ -105,6 +152,11 @@ func NewUpsertPolicyCmd() *cobra.Command {
parsedConcurrency = &floatConcurrency
}

parsedEnvironmentVersionRollout, err := parseEnvironmentVersionRollout(environmentVersionRollout)
if err != nil {
return fmt.Errorf("invalid environment version rollout JSON: %w", err)
}

// Create policy request
body := api.UpsertPolicyJSONRequestBody{
Name: name,
Expand All @@ -121,6 +173,7 @@ func NewUpsertPolicyCmd() *cobra.Command {
},
DeploymentVersionSelector: parsedDeploymentVersionSelector,
Concurrency: parsedConcurrency,
EnvironmentVersionRollout: parsedEnvironmentVersionRollout,
}

resp, err := client.UpsertPolicy(cmd.Context(), body)
Expand All @@ -142,6 +195,7 @@ func NewUpsertPolicyCmd() *cobra.Command {
cmd.Flags().StringVar(&resourceTargetSelector, "resource-selector", "", "JSON string for resource target selector")
cmd.Flags().IntVarP(&concurrency, "concurrency", "c", 0, "Concurrency of the policy")
cmd.Flags().StringVar(&deploymentVersionSelector, "version-selector", "", "JSON string for version selector")
cmd.Flags().StringVar(&environmentVersionRollout, "environment-version-rollout", "", "JSON string for environment version rollout")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Add usage example for the new CLI flag.

The new --environment-version-rollout flag lacks documentation and examples, making it difficult for users to understand the expected JSON format.

Consider adding an example to the command's usage documentation around lines 75-90:

 			# Upsert a policy with version approvals
 			$ ctrlc api upsert policy --name my-policy --version-any-approvals '{"requiredApprovalsCount": 2}' --version-user-approvals '[{"userId": "user1"}, {"userId": "user2"}]' --version-role-approvals '[{"roleId": "role1", "requiredApprovalsCount": 1}]'
+
+			# Upsert a policy with environment version rollout
+			$ ctrlc api upsert policy --name my-policy --environment-version-rollout '{"timeScaleInterval": 300.0, "rolloutType": "linear", "positionGrowthFactor": 1.5}'
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
cmd.Flags().StringVar(&environmentVersionRollout, "environment-version-rollout", "", "JSON string for environment version rollout")
# Upsert a policy with version approvals
$ ctrlc api upsert policy --name my-policy --version-any-approvals '{"requiredApprovalsCount": 2}' --version-user-approvals '[{"userId": "user1"}, {"userId": "user2"}]' --version-role-approvals '[{"roleId": "role1", "requiredApprovalsCount": 1}]'
# Upsert a policy with environment version rollout
$ ctrlc api upsert policy --name my-policy --environment-version-rollout '{"timeScaleInterval": 300.0, "rolloutType": "linear", "positionGrowthFactor": 1.5}'
🤖 Prompt for AI Agents
In cmd/ctrlc/root/api/upsert/policy/policy.go around lines 75 to 90, add a usage
example for the new --environment-version-rollout CLI flag in the command's
usage documentation. Include a clear example JSON string showing the expected
format to help users understand how to use this flag correctly.


// Mark required flags
cmd.MarkFlagRequired("name")
Expand Down
16 changes: 16 additions & 0 deletions cmd/ctrlc/root/apply/policy.go
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,21 @@ func createPolicyRequestBody(policy Policy) api.UpsertPolicyJSONRequestBody {
concurrency = &floatConcurrency
}

var environmentVersionRollout *api.InsertEnvironmentVersionRollout
if policy.EnvironmentVersionRollout != nil {
var rolloutType *api.InsertEnvironmentVersionRolloutRolloutType
if policy.EnvironmentVersionRollout.RolloutType != nil {
parsedRolloutType := *policy.EnvironmentVersionRollout.RolloutType
rolloutTypeCasted := api.InsertEnvironmentVersionRolloutRolloutType(parsedRolloutType)
rolloutType = &rolloutTypeCasted
}
environmentVersionRollout = &api.InsertEnvironmentVersionRollout{
PositionGrowthFactor: policy.EnvironmentVersionRollout.PositionGrowthFactor,
TimeScaleInterval: policy.EnvironmentVersionRollout.TimeScaleInterval,
RolloutType: rolloutType,
}
}

return api.UpsertPolicyJSONRequestBody{
Name: policy.Name,
Description: policy.Description,
Expand All @@ -132,6 +147,7 @@ func createPolicyRequestBody(policy Policy) api.UpsertPolicyJSONRequestBody {
VersionUserApprovals: &versionUserApprovals,
VersionRoleApprovals: &versionRoleApprovals,
Concurrency: concurrency,
EnvironmentVersionRollout: environmentVersionRollout,
}
}

Expand Down
7 changes: 7 additions & 0 deletions cmd/ctrlc/root/apply/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ type Policy struct {
VersionUserApprovals []VersionUserApproval `yaml:"versionUserApprovals,omitempty"`
VersionRoleApprovals []VersionRoleApproval `yaml:"versionRoleApprovals,omitempty"`
Concurrency *int `yaml:"concurrency,omitempty"`
EnvironmentVersionRollout *EnvironmentVersionRollout `yaml:"environmentVersionRollout,omitempty"`
}

type PolicyTarget struct {
Expand Down Expand Up @@ -161,3 +162,9 @@ type VersionRoleApproval struct {
RoleId string `yaml:"roleId"`
RequiredApprovalsCount float32 `yaml:"requiredApprovalsCount"`
}

type EnvironmentVersionRollout struct {
PositionGrowthFactor *float32 `yaml:"positionGrowthFactor,omitempty"`
TimeScaleInterval float32 `yaml:"timeScaleInterval"`
RolloutType *string `yaml:"rolloutType,omitempty"`
}
Loading