github.com/Axway/agent-sdk@v1.1.101/pkg/agent/agent_test.go (about)

     1  package agent
     2  
     3  import (
     4  	"encoding/json"
     5  	"net/http"
     6  	"net/http/httptest"
     7  	"strings"
     8  	"testing"
     9  
    10  	"github.com/Axway/agent-sdk/pkg/apic"
    11  	"github.com/Axway/agent-sdk/pkg/apic/definitions"
    12  
    13  	"github.com/Axway/agent-sdk/pkg/util/log"
    14  
    15  	v1 "github.com/Axway/agent-sdk/pkg/apic/apiserver/models/api/v1"
    16  	management "github.com/Axway/agent-sdk/pkg/apic/apiserver/models/management/v1alpha1"
    17  	"github.com/Axway/agent-sdk/pkg/config"
    18  	"github.com/stretchr/testify/assert"
    19  )
    20  
    21  func resetResources() {
    22  	agent.agentResourceManager = nil
    23  	if agent.cacheManager != nil {
    24  		agent.cacheManager.ApplyResourceReadLock()
    25  		defer agent.cacheManager.ReleaseResourceReadLock()
    26  		agent.cacheManager = nil
    27  	}
    28  	agent.isInitialized = false
    29  	agent.apicClient = nil
    30  	agent.agentFeaturesCfg = nil
    31  }
    32  
    33  func createCentralCfg(url, env string) *config.CentralConfiguration {
    34  	cfg := config.NewCentralConfig(config.DiscoveryAgent).(*config.CentralConfiguration)
    35  	cfg.URL = url
    36  	cfg.SingleURL = url
    37  	cfg.TenantID = "123456"
    38  	cfg.Environment = env
    39  	cfg.APICDeployment = "apic"
    40  	authCfg := cfg.Auth.(*config.AuthConfiguration)
    41  	authCfg.URL = url + "/auth"
    42  	authCfg.Realm = "Broker"
    43  	authCfg.ClientID = "serviceaccount_1111"
    44  	authCfg.PrivateKey = "../transaction/testdata/private_key.pem"
    45  	authCfg.PublicKey = "../transaction/testdata/public_key"
    46  	return cfg
    47  }
    48  
    49  func createOfflineCentralCfg(url, env string) *config.CentralConfiguration {
    50  	cfg := config.NewCentralConfig(config.TraceabilityAgent).(*config.CentralConfiguration)
    51  	cfg.EnvironmentID = "abc123"
    52  	cfg.UsageReporting.(*config.UsageReportingConfiguration).Offline = true
    53  	return cfg
    54  }
    55  
    56  func createDiscoveryAgentRes(id, name, dataplane, filter string) *v1.ResourceInstance {
    57  	res := &management.DiscoveryAgent{
    58  		ResourceMeta: v1.ResourceMeta{
    59  			Name: name,
    60  			Metadata: v1.Metadata{
    61  				ID: id,
    62  			},
    63  		},
    64  		Spec: management.DiscoveryAgentSpec{
    65  			DataplaneType: dataplane,
    66  			Config: management.DiscoveryAgentSpecConfig{
    67  				Filter: filter,
    68  			},
    69  		},
    70  	}
    71  	instance, _ := res.AsInstance()
    72  	return instance
    73  }
    74  
    75  func createTraceabilityAgentRes(id, name, dataplane string, processHeaders bool) *v1.ResourceInstance {
    76  	res := &management.TraceabilityAgent{
    77  		ResourceMeta: v1.ResourceMeta{
    78  			Name: name,
    79  			Metadata: v1.Metadata{
    80  				ID: id,
    81  			},
    82  		},
    83  		Spec: management.TraceabilityAgentSpec{
    84  			DataplaneType: dataplane,
    85  			Config: management.TraceabilityAgentSpecConfig{
    86  				ProcessHeaders: processHeaders,
    87  			},
    88  		},
    89  	}
    90  	instance, _ := res.AsInstance()
    91  	return instance
    92  }
    93  
    94  type TestConfig struct {
    95  	resourceChanged bool
    96  }
    97  
    98  func (a *TestConfig) ApplyResources(agentResource *v1.ResourceInstance) error {
    99  	a.resourceChanged = true
   100  	return nil
   101  }
   102  
   103  func TestAgentInitialize(t *testing.T) {
   104  	const (
   105  		daName = "discovery"
   106  		taName = "traceability"
   107  	)
   108  
   109  	teams := []definitions.PlatformTeam{
   110  		{
   111  			ID:      "123",
   112  			Name:    "name",
   113  			Default: true,
   114  		},
   115  	}
   116  	environmentRes := &management.Environment{
   117  		ResourceMeta: v1.ResourceMeta{
   118  			Metadata: v1.Metadata{ID: "123"},
   119  			Name:     "v7",
   120  			Title:    "v7",
   121  		},
   122  	}
   123  	discoveryAgentRes := createDiscoveryAgentRes("111", daName, "v7-dataplane", "")
   124  	traceabilityAgentRes := createTraceabilityAgentRes("111", taName, "v7-dataplane", false)
   125  
   126  	s := httptest.NewServer(http.HandlerFunc(func(resp http.ResponseWriter, req *http.Request) {
   127  		if strings.Contains(req.RequestURI, "/auth") {
   128  			token := "{\"access_token\":\"somevalue\",\"expires_in\": 12235677}"
   129  			resp.Write([]byte(token))
   130  			return
   131  		}
   132  
   133  		if strings.Contains(req.RequestURI, "/apis/management/v1alpha1/environments/v7/discoveryagents/"+daName) {
   134  			buf, err := json.Marshal(discoveryAgentRes)
   135  			log.Error(err)
   136  			resp.Write(buf)
   137  			return
   138  		}
   139  
   140  		if strings.Contains(req.RequestURI, "/apis/management/v1alpha1/environments/v7/traceabilityagents/"+taName) {
   141  			buf, err := json.Marshal(traceabilityAgentRes)
   142  			log.Error(err)
   143  			resp.Write(buf)
   144  			return
   145  		}
   146  
   147  		if strings.Contains(req.RequestURI, "/apis/management/v1alpha1/environments/v7") {
   148  			buf, _ := json.Marshal(environmentRes)
   149  			resp.Write(buf)
   150  			return
   151  		}
   152  
   153  		if strings.Contains(req.RequestURI, "/api/v1/platformTeams") {
   154  			buf, _ := json.Marshal(teams)
   155  			resp.Write(buf)
   156  			return
   157  		}
   158  	}))
   159  
   160  	defer s.Close()
   161  
   162  	cfg := createOfflineCentralCfg(s.URL, "v7")
   163  	// Test with offline mode
   164  	resetResources()
   165  	err := Initialize(cfg)
   166  	assert.Nil(t, err)
   167  	da := GetAgentResource()
   168  	assert.Nil(t, da)
   169  
   170  	cfg = createCentralCfg(s.URL, "v7")
   171  	// Test with no agent name - config to be validate successfully as no calls made to get agent and dataplane resource
   172  	resetResources()
   173  	err = Initialize(cfg)
   174  	assert.Nil(t, err)
   175  	da = GetAgentResource()
   176  	assert.Nil(t, da)
   177  
   178  	cfg.AgentType = config.DiscoveryAgent
   179  	AgentResourceType = management.DiscoveryAgentResourceName
   180  	cfg.AgentName = daName
   181  	resetResources()
   182  	err = Initialize(cfg)
   183  	assert.Nil(t, err)
   184  
   185  	da = GetAgentResource()
   186  	assertResource(t, da, discoveryAgentRes)
   187  
   188  	cfg.AgentType = config.TraceabilityAgent
   189  	AgentResourceType = management.TraceabilityAgentResourceName
   190  	cfg.AgentName = taName
   191  	resetResources()
   192  	err = Initialize(cfg)
   193  	assert.Nil(t, err)
   194  
   195  	da = GetAgentResource()
   196  	assertResource(t, da, traceabilityAgentRes)
   197  
   198  	agentCfg := &TestConfig{
   199  		resourceChanged: false,
   200  	}
   201  
   202  	ApplyResourceToConfig(agentCfg)
   203  
   204  	assert.True(t, agentCfg.resourceChanged)
   205  
   206  	// Test for resource change
   207  	traceabilityAgentRes = createTraceabilityAgentRes("111", taName, "v7-dataplane", true)
   208  	resetResources()
   209  
   210  	agentResChangeHandlerCall := 0
   211  	OnAgentResourceChange(func() { agentResChangeHandlerCall++ })
   212  
   213  	err = Initialize(cfg)
   214  	assert.Nil(t, err)
   215  
   216  	da = GetAgentResource()
   217  	assertResource(t, da, traceabilityAgentRes)
   218  	assert.Equal(t, 0, agentResChangeHandlerCall)
   219  }
   220  
   221  func TestInitEnvironment(t *testing.T) {
   222  	teams := []definitions.PlatformTeam{
   223  		{
   224  			ID:      "123",
   225  			Name:    "name",
   226  			Default: true,
   227  		},
   228  	}
   229  	environmentRes := management.NewEnvironment("v7")
   230  	environmentRes.Title = "v7"
   231  	environmentRes.Metadata.ID = "123"
   232  
   233  	s := httptest.NewServer(http.HandlerFunc(func(resp http.ResponseWriter, req *http.Request) {
   234  		if strings.Contains(req.RequestURI, "/auth") {
   235  			token := "{\"access_token\":\"somevalue\",\"expires_in\": 12235677}"
   236  			resp.Write([]byte(token))
   237  			return
   238  		}
   239  
   240  		if strings.Contains(req.RequestURI, "/apis/management/v1alpha1/environments/v7") {
   241  			if req.Method == "GET" {
   242  				buf, _ := json.Marshal(environmentRes)
   243  				resp.Write(buf)
   244  			} else if req.Method == "PUT" {
   245  				subRes := &management.Environment{}
   246  				json.NewDecoder(req.Body).Decode(subRes)
   247  				environmentRes.ResourceMeta.SubResources = subRes.ResourceMeta.SubResources
   248  			}
   249  			return
   250  		}
   251  
   252  		if strings.Contains(req.RequestURI, "/api/v1/platformTeams") {
   253  			buf, _ := json.Marshal(teams)
   254  			resp.Write(buf)
   255  			return
   256  		}
   257  	}))
   258  
   259  	defer s.Close()
   260  
   261  	cfg := createCentralCfg(s.URL, "v7")
   262  	cfg.AgentType = config.GenericService
   263  	agent.cfg = cfg
   264  	initializeTokenRequester(agent.cfg)
   265  	apiClient := apic.New(agent.cfg, agent.tokenRequester, agent.cacheManager)
   266  	// Test with no agent name - config to be validate successfully as no calls made to get agent and dataplane resource
   267  
   268  	defer resetResources()
   269  	err := initEnvResources(agent.cfg, apiClient)
   270  	assert.Nil(t, err)
   271  
   272  	cfg = createCentralCfg(s.URL, "v7")
   273  	cfg.AgentType = config.DiscoveryAgent
   274  	agent.cfg = cfg
   275  	err = initEnvResources(agent.cfg, apiClient)
   276  	assert.Nil(t, err)
   277  
   278  	cfg = createCentralCfg(s.URL, "v7")
   279  	cfg.AgentType = config.TraceabilityAgent
   280  	agent.cfg = cfg
   281  	err = initEnvResources(agent.cfg, apiClient)
   282  	assert.Nil(t, err)
   283  }
   284  
   285  func TestAgentConfigOverride(t *testing.T) {
   286  	const (
   287  		daName = "discovery"
   288  		taName = "traceability"
   289  	)
   290  
   291  	teams := []definitions.PlatformTeam{
   292  		{
   293  			ID:      "123",
   294  			Name:    "name",
   295  			Default: true,
   296  		},
   297  	}
   298  	environmentRes := &management.Environment{
   299  		ResourceMeta: v1.ResourceMeta{
   300  			Metadata: v1.Metadata{ID: "123"},
   301  			Name:     "v7",
   302  			Title:    "v7",
   303  		},
   304  	}
   305  	discoveryAgentRes := createDiscoveryAgentRes("111", daName, "v7-dataplane", "")
   306  	traceabilityAgentRes := createTraceabilityAgentRes("111", taName, "v7-dataplane", false)
   307  
   308  	s := httptest.NewServer(http.HandlerFunc(func(resp http.ResponseWriter, req *http.Request) {
   309  		if strings.Contains(req.RequestURI, "/auth") {
   310  			token := "{\"access_token\":\"somevalue\",\"expires_in\": 12235677}"
   311  			resp.Write([]byte(token))
   312  		}
   313  
   314  		if strings.Contains(req.RequestURI, "/apis/management/v1alpha1/environments/v7/discoveryagents/"+daName) {
   315  			buf, _ := json.Marshal(discoveryAgentRes)
   316  			resp.Write(buf)
   317  			return
   318  		}
   319  
   320  		if strings.Contains(req.RequestURI, "/apis/management/v1alpha1/environments/v7/traceabilityagents/"+taName) {
   321  			buf, _ := json.Marshal(traceabilityAgentRes)
   322  			resp.Write(buf)
   323  			return
   324  		}
   325  
   326  		if strings.Contains(req.RequestURI, "/apis/management/v1alpha1/environments/v7") {
   327  			buf, _ := json.Marshal(environmentRes)
   328  			resp.Write(buf)
   329  			return
   330  		}
   331  
   332  		if strings.Contains(req.RequestURI, "/api/v1/platformTeams") {
   333  			buf, _ := json.Marshal(teams)
   334  			resp.Write(buf)
   335  			return
   336  		}
   337  	}))
   338  
   339  	defer s.Close()
   340  
   341  	cfg := createCentralCfg(s.URL, "v7")
   342  
   343  	AgentResourceType = management.DiscoveryAgentResourceName
   344  	cfg.AgentName = "discovery"
   345  	resetResources()
   346  	err := Initialize(cfg)
   347  	assert.Nil(t, err)
   348  
   349  	da := GetAgentResource()
   350  	assertResource(t, da, discoveryAgentRes)
   351  
   352  }
   353  
   354  func TestAgentAgentFeaturesOnByDefault(t *testing.T) {
   355  	cfg := createCentralCfg("http://test", "v7")
   356  	resetResources()
   357  	err := Initialize(cfg)
   358  	assert.NoError(t, err)
   359  
   360  	// Assert the agent features are on by default
   361  	assert.True(t, agent.agentFeaturesCfg.ConnectionToCentralEnabled())
   362  	assert.True(t, agent.agentFeaturesCfg.ProcessSystemSignalsEnabled())
   363  	assert.True(t, agent.agentFeaturesCfg.VersionCheckerEnabled())
   364  
   365  	assert.NotNil(t, agent.apicClient)
   366  }
   367  
   368  func TestAgentAgentFeaturesDisabled(t *testing.T) {
   369  	// Create invalid Central config
   370  	cfg := config.NewCentralConfig(config.GenericService).(*config.CentralConfiguration)
   371  	resetResources()
   372  	agentFeatures := &config.AgentFeaturesConfiguration{
   373  		ConnectToCentral:     false,
   374  		ProcessSystemSignals: false,
   375  		VersionChecker:       false,
   376  	}
   377  	err := InitializeWithAgentFeatures(cfg, agentFeatures)
   378  	assert.NoError(t, err) // This asserts central config is not being validated as ConnectToCentral is false
   379  
   380  	assert.False(t, agent.agentFeaturesCfg.ConnectionToCentralEnabled())
   381  	assert.False(t, agent.agentFeaturesCfg.ProcessSystemSignalsEnabled())
   382  	assert.False(t, agent.agentFeaturesCfg.VersionCheckerEnabled())
   383  
   384  	// Assert no api client
   385  	assert.Nil(t, agent.apicClient)
   386  }
   387  
   388  func assertResource(t *testing.T, res, expectedRes *v1.ResourceInstance) {
   389  	assert.Equal(t, expectedRes.Group, res.Group)
   390  	assert.Equal(t, expectedRes.Kind, res.Kind)
   391  	assert.Equal(t, expectedRes.Name, res.Name)
   392  	assert.Equal(t, expectedRes.Metadata.ID, res.Metadata.ID)
   393  	assert.Equal(t, expectedRes.Spec, res.Spec)
   394  }