Skip to content
Closed
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
29 changes: 17 additions & 12 deletions otdfctl/e2e/migrate-namespaced-policy.bats
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,8 @@ subject_mapping_plan_target_count() {
[
.subject_mappings[]
| select(.source.id == $source_mapping_id)
| .targets[]
| .target
| select(. != null)
] | length
' "$output_file"
}
Expand All @@ -130,7 +131,7 @@ subject_mapping_plan_target_status() {
jq -er --arg source_mapping_id "$source_mapping_id" --arg namespace_fqn "$namespace_fqn" '
.subject_mappings[]
| select(.source.id == $source_mapping_id)
| .targets[]
| .target
| select(.namespace.fqn == $namespace_fqn)
| .status
' "$output_file"
Expand All @@ -143,9 +144,9 @@ subject_mapping_plan_target_effective_id() {
jq -er --arg source_mapping_id "$source_mapping_id" --arg namespace_fqn "$namespace_fqn" '
.subject_mappings[]
| select(.source.id == $source_mapping_id)
| .targets[]
| .target
| select(.namespace.fqn == $namespace_fqn)
| (.execution.created_target_id // .existing.id // empty)
| (.execution.created_target_id // .existing_id // empty)
' "$output_file"
}

Expand All @@ -155,12 +156,10 @@ subject_mapping_plan_action_status() {
local namespace_fqn="$3"
local source_action_id="$4"
jq -er --arg source_mapping_id "$source_mapping_id" --arg namespace_fqn "$namespace_fqn" --arg source_action_id "$source_action_id" '
.subject_mappings[]
| select(.source.id == $source_mapping_id)
.actions[]
| select(.source.id == $source_action_id)
| .targets[]
| select(.namespace.fqn == $namespace_fqn)
| .actions[]
| select(.source_id == $source_action_id)
| .status
' "$output_file"
}
Expand All @@ -170,11 +169,17 @@ subject_mapping_plan_scs_status() {
local source_mapping_id="$2"
local namespace_fqn="$3"
jq -er --arg source_mapping_id "$source_mapping_id" --arg namespace_fqn "$namespace_fqn" '
.subject_mappings[]
. as $plan
| $plan.subject_mappings[]
| select(.source.id == $source_mapping_id)
| .target
| select(.namespace.fqn == $namespace_fqn)
| .subject_condition_set_source_id as $source_scs_id
| $plan.subject_condition_sets[]
| select(.source.id == $source_scs_id)
| .targets[]
| select(.namespace.fqn == $namespace_fqn)
| .subject_condition_set.status
| .status
' "$output_file"
}

Expand Down Expand Up @@ -364,7 +369,7 @@ action_plan_target_effective_id() {
| select(.source.name == $action_name)
| .targets[]
| select(.namespace.fqn == $namespace_fqn)
| (.execution.created_target_id // .existing.id // empty)
| (.execution.created_target_id // .existing_id // empty)
' "$output_file"
}

Expand Down Expand Up @@ -402,7 +407,7 @@ scs_plan_target_effective_id() {
| select(.source.id == $source_scs_id)
| .targets[]
| select(.namespace.fqn == $namespace_fqn)
| (.execution.created_target_id // .existing.id // empty)
| (.execution.created_target_id // .existing_id // empty)
' "$output_file"
}

Expand Down
14 changes: 7 additions & 7 deletions otdfctl/migrations/namespacedpolicy/actions_execute_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,14 +46,14 @@ func TestExecuteActions(t *testing.T) {
Status: TargetStatusCreate,
},
{
Namespace: namespace2,
Status: TargetStatusExistingStandard,
Existing: &policy.Action{Id: "standard-action"},
Namespace: namespace2,
Status: TargetStatusExistingStandard,
ExistingID: "standard-action",
},
{
Namespace: namespace3,
Status: TargetStatusAlreadyMigrated,
Existing: &policy.Action{Id: "migrated-action"},
Namespace: namespace3,
Status: TargetStatusAlreadyMigrated,
ExistingID: "migrated-action",
},
},
},
Expand Down Expand Up @@ -85,7 +85,7 @@ func TestExecuteActions(t *testing.T) {

createdTarget := plan.Actions[0].Targets[0]
assert.Equal(t, TargetStatusCreate, createdTarget.Status)
assert.Nil(t, createdTarget.Existing)
assert.Empty(t, createdTarget.ExistingID)
require.NotNil(t, createdTarget.Execution)
assert.True(t, createdTarget.Execution.Applied)
assert.Equal(t, "created-action-1", createdTarget.Execution.CreatedTargetID)
Expand Down
7 changes: 5 additions & 2 deletions otdfctl/migrations/namespacedpolicy/execute.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ type ExecutorHandler interface {
CreateObligationTrigger(ctx context.Context, attributeValue, action, obligationValue, clientID string, metadata *common.MetadataMutable) (*policy.ObligationTrigger, error)
CreateRegisteredResource(ctx context.Context, namespace string, name string, values []string, metadata *common.MetadataMutable) (*policy.RegisteredResource, error)
CreateRegisteredResourceValue(ctx context.Context, resourceID string, value string, actionAttributeValues []*registeredresources.ActionAttributeValue, metadata *common.MetadataMutable) (*policy.RegisteredResourceValue, error)
GetRegisteredResource(ctx context.Context, id, name, namespace string) (*policy.RegisteredResource, error)
}

type Executor struct {
Expand Down Expand Up @@ -93,8 +94,10 @@ func (e *Executor) validatePlan(plan *Plan) error {
if plan == nil {
return ErrNilExecutionPlan
}
if plan.Unresolved != nil && hasUnresolved(*plan.Unresolved) {
return fmt.Errorf("%w: finalized plan contains unresolved entries", ErrPlanNotExecutable)
for _, resource := range plan.RegisteredResources { // ? This should be a function withint the plan.go file
if resource != nil && resource.Unresolved != "" {
return fmt.Errorf("%w: finalized plan contains unresolved registered resources", ErrPlanNotExecutable)
}
}
Comment on lines +97 to 101

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

As your comment on line 97 suggests, this validation logic would be better encapsulated as a method on the Plan struct. This improves maintainability by keeping the validation logic coupled with the data structure it validates.

Consider adding a Validate() method to the Plan struct in plan.go:

// In plan.go
func (p *Plan) Validate() error {
	for _, resource := range p.RegisteredResources {
		if resource != nil && resource.Unresolved != "" {
			return fmt.Errorf("%w: finalized plan contains unresolved registered resources", ErrPlanNotExecutable)
		}
	}
	return nil
}

Then, you can replace this loop with a call to plan.Validate().

Comment thread
c-r33d marked this conversation as resolved.

return nil
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ type mockExecutorHandler struct {
obligationTriggerErrs map[string]map[string]error
createdRegisteredResources map[string]map[string]*createdRegisteredResourceCall
registeredResourceResult map[string]map[string]*policy.RegisteredResource
registeredResourcesByID map[string]*policy.RegisteredResource
registeredResourceErrs map[string]map[string]error
createdRegisteredResourceValues map[string]map[string]*createdRegisteredResourceValueCall
registeredResourceValueResult map[string]map[string]*policy.RegisteredResourceValue
Expand Down Expand Up @@ -242,13 +243,29 @@ func (m *mockExecutorHandler) CreateRegisteredResource(_ context.Context, namesp
}
if m.registeredResourceResult != nil && m.registeredResourceResult[sourceID] != nil {
if result := m.registeredResourceResult[sourceID][namespace]; result != nil {
if m.registeredResourcesByID == nil {
m.registeredResourcesByID = make(map[string]*policy.RegisteredResource)
}
m.registeredResourcesByID[result.GetId()] = result
return result, nil
}
}

return nil, errMissingMockRegisteredResourceResult
}

func (m *mockExecutorHandler) GetRegisteredResource(_ context.Context, id, _, _ string) (*policy.RegisteredResource, error) {
if id == "" {
return nil, errMissingMockRegisteredResourceResult
}
if m.registeredResourcesByID != nil {
if result := m.registeredResourcesByID[id]; result != nil {
return result, nil
}
}
return nil, errMissingMockRegisteredResourceResult
}

func (m *mockExecutorHandler) CreateRegisteredResourceValue(_ context.Context, resourceID string, value string, actionAttributeValues []*registeredresources.ActionAttributeValue, metadata *common.MetadataMutable) (*policy.RegisteredResourceValue, error) {
sourceID := metadata.GetLabels()[migrationLabelMigratedFrom]

Expand Down
Loading
Loading