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  }