github.com/Axway/agent-sdk@v1.1.101/pkg/agent/resource/manager_test.go (about) 1 package resource 2 3 import ( 4 "testing" 5 6 "github.com/Axway/agent-sdk/pkg/api" 7 "github.com/Axway/agent-sdk/pkg/apic/mock" 8 "github.com/Axway/agent-sdk/pkg/util/errors" 9 10 v1 "github.com/Axway/agent-sdk/pkg/apic/apiserver/models/api/v1" 11 management "github.com/Axway/agent-sdk/pkg/apic/apiserver/models/management/v1alpha1" 12 "github.com/Axway/agent-sdk/pkg/config" 13 "github.com/stretchr/testify/assert" 14 "k8s.io/apimachinery/pkg/util/json" 15 ) 16 17 func createDiscoveryAgentRes(id, name, dataplane, teamID string) *v1.ResourceInstance { 18 res := &management.DiscoveryAgent{ 19 ResourceMeta: v1.ResourceMeta{ 20 Name: name, 21 Metadata: v1.Metadata{ 22 ID: id, 23 Scope: v1.MetadataScope{ 24 Kind: management.EnvironmentGVK().Kind, 25 Name: "env", 26 }, 27 }, 28 }, 29 Spec: management.DiscoveryAgentSpec{ 30 DataplaneType: dataplane, 31 Config: management.DiscoveryAgentSpecConfig{ 32 Owner: &v1.Owner{ 33 Type: v1.TeamOwner, 34 ID: teamID, 35 }, 36 }, 37 }, 38 } 39 instance, _ := res.AsInstance() 40 return instance 41 } 42 43 func createTraceabilityAgentRes(id, name, dataplane, teamID string) *v1.ResourceInstance { 44 res := &management.TraceabilityAgent{ 45 ResourceMeta: v1.ResourceMeta{ 46 Name: name, 47 Metadata: v1.Metadata{ 48 ID: id, 49 }, 50 }, 51 Spec: management.TraceabilityAgentSpec{ 52 DataplaneType: dataplane, 53 Config: management.TraceabilityAgentSpecConfig{ 54 Owner: &v1.Owner{ 55 Type: v1.TeamOwner, 56 ID: teamID, 57 }, 58 }, 59 }, 60 } 61 instance, _ := res.AsInstance() 62 return instance 63 } 64 65 func TestNewManager(t *testing.T) { 66 cfg := &config.CentralConfiguration{} 67 m, err := NewAgentResourceManager(cfg, nil, nil) 68 assert.Nil(t, err) 69 assert.NotNil(t, m) 70 71 cfg.AgentName = "Test-DA" 72 m, err = NewAgentResourceManager(cfg, nil, nil) 73 assert.NotNil(t, err) 74 assert.Nil(t, m) 75 76 resource := createDiscoveryAgentRes("111", "Test-DA", "test-dataplane", "") 77 svcClient := &mock.Client{ 78 ExecuteAPIMock: func(method, url string, queryParam map[string]string, buffer []byte) ([]byte, error) { 79 if method == api.PUT { 80 return buffer, nil 81 } 82 return json.Marshal(resource) 83 }, 84 GetResourceMock: func(url string) (*v1.ResourceInstance, error) { 85 ri, _ := resource.AsInstance() 86 return ri, nil 87 }, 88 } 89 agentResChangeHandlerCall := 0 90 f := func() { agentResChangeHandlerCall++ } 91 cfg.AgentType = config.DiscoveryAgent 92 cfg.AgentName = "Test-DA" 93 m, err = NewAgentResourceManager(cfg, svcClient, f) 94 assert.Nil(t, err) 95 assert.NotNil(t, m) 96 m.SetAgentResource(createDiscoveryAgentRes("111", "Test-DA", "test-dataplane", "update")) 97 assert.Equal(t, 1, agentResChangeHandlerCall) 98 } 99 100 func TestAgentConfigOverride(t *testing.T) { 101 tests := []struct { 102 name string 103 agentType config.AgentType 104 agentName string 105 resource *v1.ResourceInstance 106 updatedResource *v1.ResourceInstance 107 }{ 108 { 109 name: "DiscoveryAgent override", 110 agentType: config.DiscoveryAgent, 111 agentName: "Test-DA", 112 resource: createDiscoveryAgentRes("111", "Test-DA", "test-dataplane", ""), 113 updatedResource: createDiscoveryAgentRes("111", "Test-DA", "test-dataplane", "TestTeam"), 114 }, 115 { 116 name: "TraceabilityAgent override", 117 agentType: config.TraceabilityAgent, 118 agentName: "Test-TA", 119 resource: createTraceabilityAgentRes("111", "Test-TA", "test-dataplane", ""), 120 updatedResource: createTraceabilityAgentRes("111", "Test-TA", "test-dataplane", "TestTeam"), 121 }, 122 } 123 124 for _, tc := range tests { 125 t.Run(tc.name, func(t *testing.T) { 126 cfg := &config.CentralConfiguration{} 127 cfg.AgentName = tc.agentName 128 cfg.AgentType = tc.agentType 129 130 var resource *v1.ResourceInstance 131 svcClient := &mock.Client{ 132 GetResourceMock: func(url string) (*v1.ResourceInstance, error) { 133 return resource, nil 134 }, 135 CreateSubResourceMock: func(rm v1.ResourceMeta, subs map[string]interface{}) error { 136 resource.SubResources = subs 137 return nil 138 }, 139 } 140 resource = tc.resource 141 142 agentResChangeHandlerCall := 0 143 f := func() { agentResChangeHandlerCall++ } 144 m, err := NewAgentResourceManager(cfg, svcClient, f) 145 assert.Nil(t, err) 146 assert.NotNil(t, m) 147 148 res := m.GetAgentResource() 149 assertAgentResource(t, res, tc.resource) 150 assert.Equal(t, 0, agentResChangeHandlerCall) 151 152 // Get same resource does not invoke change handler 153 m.FetchAgentResource() 154 res = m.GetAgentResource() 155 assertAgentResource(t, res, tc.resource) 156 assert.Equal(t, 0, agentResChangeHandlerCall) 157 158 // Updated resource invokes change handler 159 resource = tc.updatedResource 160 m.FetchAgentResource() 161 162 res = m.GetAgentResource() 163 assertAgentResource(t, res, tc.updatedResource) 164 assert.Equal(t, 1, agentResChangeHandlerCall) 165 }) 166 } 167 } 168 169 func TestAgentUpdateStatus(t *testing.T) { 170 tests := []struct { 171 name string 172 agentType config.AgentType 173 agentName string 174 resource *v1.ResourceInstance 175 }{ 176 { 177 name: "DiscoveryAgent override", 178 agentType: config.DiscoveryAgent, 179 agentName: "Test-DA", 180 resource: createDiscoveryAgentRes("111", "Test-DA", "test-dataplane", ""), 181 }, 182 { 183 name: "TraceabilityAgent override", 184 agentType: config.TraceabilityAgent, 185 agentName: "Test-TA", 186 resource: createTraceabilityAgentRes("111", "Test-TA", "test-dataplane", ""), 187 }, 188 { 189 name: "Create DA resource", 190 agentType: config.DiscoveryAgent, 191 agentName: "env-da", 192 resource: nil, 193 }, 194 { 195 name: "Create TA resource", 196 agentType: config.TraceabilityAgent, 197 agentName: "env-ta", 198 resource: nil, 199 }, 200 } 201 202 for _, tc := range tests { 203 t.Run(tc.name, func(t *testing.T) { 204 cfg := &config.CentralConfiguration{} 205 cfg.AgentName = tc.agentName 206 cfg.AgentType = tc.agentType 207 208 var resource *v1.ResourceInstance 209 svcClient := &mock.Client{ 210 GetResourceMock: func(url string) (*v1.ResourceInstance, error) { 211 if resource == nil { 212 return nil, errors.New(1111, "404 - Not found") 213 } 214 return resource, nil 215 }, 216 CreateSubResourceMock: func(rm v1.ResourceMeta, subs map[string]interface{}) error { 217 resource.SubResources = subs 218 return nil 219 }, 220 CreateResourceInstanceMock: func(ri v1.Interface) (*v1.ResourceInstance, error) { 221 resource, _ = ri.AsInstance() 222 tc.agentName = ri.GetName() 223 return resource, nil 224 }, 225 } 226 resource = tc.resource 227 228 m, err := NewAgentResourceManager(cfg, svcClient, nil) 229 230 assert.Nil(t, err) 231 assert.NotNil(t, m) 232 m.UpdateAgentStatus("stopped", "running", "test") 233 assertAgentStatusResource(t, resource, tc.agentName, "stopped", "running", "test") 234 }) 235 } 236 } 237 238 func assertAgentResource(t *testing.T, res, expectedRes *v1.ResourceInstance) { 239 assert.Equal(t, expectedRes.Group, res.Group) 240 assert.Equal(t, expectedRes.Kind, res.Kind) 241 assert.Equal(t, expectedRes.Name, res.Name) 242 assert.Equal(t, expectedRes.Metadata.ID, res.Metadata.ID) 243 assert.Equal(t, expectedRes.Spec["dataplane"], res.Spec["dataplane"]) 244 assert.Equal(t, expectedRes.Spec["config"], res.Spec["config"]) 245 } 246 247 func assertAgentStatusResource(t *testing.T, agentRes *v1.ResourceInstance, agentName, state, previousState, message string) { 248 statusSubRes := agentRes.GetSubResource("status").(management.DiscoveryAgentStatus) 249 250 assert.NotNil(t, statusSubRes) 251 assert.Equal(t, state, statusSubRes.State) 252 assert.Equal(t, previousState, statusSubRes.PreviousState) 253 assert.Equal(t, message, statusSubRes.Message) 254 }