From f4cd618106e64b5187b451f58153691fc2e7cd4e Mon Sep 17 00:00:00 2001 From: Rui Ling Date: Wed, 9 Mar 2022 15:12:11 -0800 Subject: [PATCH 1/4] NFV-18410: add mgmt acl for secondary device and fix unit test cases --- internal/api/device.go | 1 + rest_device.go | 1 + rest_device_test.go | 2 ++ 3 files changed, 4 insertions(+) diff --git a/internal/api/device.go b/internal/api/device.go index 6951d11..edf9d4e 100644 --- a/internal/api/device.go +++ b/internal/api/device.go @@ -85,6 +85,7 @@ type SecondaryDeviceRequest struct { AdditionalBandwidth *int `json:"additionalBandwidth,omitempty,string"` SshInterfaceId *string `json:"sshInterfaceId,omitempty"` ACLTemplateUUID *string `json:"aclTemplateUuid,omitempty"` + MgmtAclTemplateUuid *string `json:"mgmtAclTemplateUuid,omitempty"` VendorConfig map[string]string `json:"vendorConfig,omitempty"` UserPublicKey *DeviceUserPublicKeyRequest `json:"userPublicKey,omitempty"` } diff --git a/rest_device.go b/rest_device.go index a3c2dc3..ebe2da3 100644 --- a/rest_device.go +++ b/rest_device.go @@ -389,6 +389,7 @@ func createRedundantDeviceRequest(primary Device, secondary Device) api.DeviceRe secReq.SshInterfaceId = req.SshInterfaceId } secReq.ACLTemplateUUID = secondary.ACLTemplateUUID + secReq.MgmtAclTemplateUuid = secondary.MgmtAclTemplateUuid secReq.VendorConfig = secondary.VendorConfiguration secReq.UserPublicKey = mapDeviceUserPublicKeyDomainToAPI(secondary.UserPublicKey) req.Secondary = &secReq diff --git a/rest_device_test.go b/rest_device_test.go index 3c24c54..aa7e77e 100644 --- a/rest_device_test.go +++ b/rest_device_test.go @@ -95,6 +95,7 @@ func TestCreateRedundantDevice(t *testing.T) { AccountNumber: String("99999"), AdditionalBandwidth: Int(200), ACLTemplateUUID: String("4972e8d2-417f-4821-91a8-f4a61a6dcdc3"), + MgmtAclTemplateUuid: String("4972e8d2-417f-4821-91a8-f4a61a6dcdc3"), VendorConfiguration: map[string]string{ "serialNumber": "2222222", "controller1": "2.2.2.2", @@ -478,6 +479,7 @@ func verifyRedundantDeviceRequest(t *testing.T, primary, secondary Device, req a assert.Equal(t, secondary.AccountNumber, req.Secondary.AccountNumber, "Secondary AccountNumber matches") assert.Equal(t, secondary.AdditionalBandwidth, req.Secondary.AdditionalBandwidth, "Secondary AdditionalBandwidth matches") assert.Equal(t, secondary.ACLTemplateUUID, req.Secondary.ACLTemplateUUID, "Secondary ACLTemplateUUID matches") + assert.Equal(t, secondary.MgmtAclTemplateUuid, req.Secondary.MgmtAclTemplateUuid, "Secondary MgmtAclTemplateUuid matches") assert.Equal(t, secondary.VendorConfiguration, req.Secondary.VendorConfig, "Secondary VendorConfigurations match") assert.NotNil(t, req.Secondary.UserPublicKey, "UserPublicKey is not nil") verifyDeviceUserPublicKeyRequest(t, *secondary.UserPublicKey, *req.Secondary.UserPublicKey) From 043000ede4652cf33b58db4e54be5e1afaed5958 Mon Sep 17 00:00:00 2001 From: Rui Ling Date: Fri, 11 Mar 2022 11:21:06 -0800 Subject: [PATCH 2/4] NFV-18410: modify cluster structure and fix unit test cases --- client.go | 22 ++++++++-------------- internal/api/device.go | 1 - rest_device.go | 15 ++++++--------- rest_device_test.go | 29 +++++++++++++---------------- 4 files changed, 27 insertions(+), 40 deletions(-) diff --git a/client.go b/client.go index 71c4788..321d467 100644 --- a/client.go +++ b/client.go @@ -428,24 +428,18 @@ type DeviceLinkGroupLink struct { //ClusterDetails describes Network Edge cluster device details type ClusterDetails struct { - ClusterName *string - NumOfNodes *int - ClusterNodeDetails map[string]*ClusterNodeDetail - ClusterId *string - Nodes []ClusterNode + ClusterId *string + ClusterName *string + NumOfNodes *int + Node0 *ClusterNodeDetail + Node1 *ClusterNodeDetail } -//ClusterNodeDetail describes Network Edge cluster node configuration +//ClusterNodeDetail describes Network Edge cluster node details type ClusterNodeDetail struct { - VendorConfiguration map[string]string - LicenseFileId *string - LicenseToken *string -} - -type ClusterNode struct { UUID *string Name *string - Node *int - AdminPassword *string VendorConfiguration map[string]string + LicenseFileId *string + LicenseToken *string } diff --git a/internal/api/device.go b/internal/api/device.go index edf9d4e..85009c6 100644 --- a/internal/api/device.go +++ b/internal/api/device.go @@ -170,7 +170,6 @@ type DeviceACLResponse struct { //ClusterDetailsRequest describes cluster details of device creation request type ClusterDetailsRequest struct { ClusterName *string `json:"clusterName,omitempty"` - NumOfNodes *int `json:"numOfNodes,omitempty"` ClusterNodeDetails map[string]ClusterNodeDetailRequest `json:"clusterNodeDetails,omitempty"` } diff --git a/rest_device.go b/rest_device.go index ebe2da3..7a86331 100644 --- a/rest_device.go +++ b/rest_device.go @@ -287,17 +287,16 @@ func mapDeviceClusterDetailsAPIToDomain(apiClusterDetails *api.ClusterDetails) * clusterDetails.ClusterName = apiClusterDetails.ClusterName clusterDetails.NumOfNodes = apiClusterDetails.NumOfNodes apiNodes := apiClusterDetails.Nodes - transformed := make([]ClusterNode, len(apiNodes)) + transformed := make([]*ClusterNodeDetail, len(apiNodes)) for i := range apiNodes { - transformed[i] = ClusterNode{ + transformed[i] = &ClusterNodeDetail{ UUID: apiNodes[i].UUID, Name: apiNodes[i].Name, - Node: apiNodes[i].Node, - AdminPassword: apiNodes[i].AdminPassword, VendorConfiguration: apiNodes[i].VendorConfiguration, } } - clusterDetails.Nodes = transformed + clusterDetails.Node0 = transformed[0] + clusterDetails.Node1 = transformed[1] return &clusterDetails } @@ -307,11 +306,9 @@ func mapDeviceClusterDetailsDomainToAPI(clusterDetails *ClusterDetails) *api.Clu } req := api.ClusterDetailsRequest{} req.ClusterName = clusterDetails.ClusterName - req.NumOfNodes = clusterDetails.NumOfNodes clusterNodeDetailsRequest := make(map[string]api.ClusterNodeDetailRequest) - for k, v := range clusterDetails.ClusterNodeDetails { - clusterNodeDetailsRequest[k] = *mapDeviceClusterNodeDetailDomainToAPI(v) - } + clusterNodeDetailsRequest["node0"] = *mapDeviceClusterNodeDetailDomainToAPI(clusterDetails.Node0) + clusterNodeDetailsRequest["node1"] = *mapDeviceClusterNodeDetailDomainToAPI(clusterDetails.Node1) req.ClusterNodeDetails = clusterNodeDetailsRequest return &req } diff --git a/rest_device_test.go b/rest_device_test.go index aa7e77e..7755c21 100644 --- a/rest_device_test.go +++ b/rest_device_test.go @@ -156,21 +156,19 @@ func TestCreateClusterDevice(t *testing.T) { }, ClusterDetails: &ClusterDetails{ ClusterName: String("clusterName"), - ClusterNodeDetails: map[string]*ClusterNodeDetail{ - "node0": { - VendorConfiguration: map[string]string{ - "hostName": "panw-host0", - }, - LicenseFileId: String("8d180057-8309-4c59-b645-f630f010ad43"), - LicenseToken: String("licenseToken"), + Node0: &ClusterNodeDetail{ + VendorConfiguration: map[string]string{ + "hostname": "panw-host0", }, - "node1": { - VendorConfiguration: map[string]string{ - "hostName": "panw-host1", - }, - LicenseFileId: String("8d180057-8309-4c59-b645-f630f010ad43"), - LicenseToken: String("licenseToken"), + LicenseFileId: String("8d180057-8309-4c59-b645-f630f010ad43"), + LicenseToken: String("licenseToken"), + }, + Node1: &ClusterNodeDetail{ + VendorConfiguration: map[string]string{ + "hostname": "panw-host1", }, + LicenseFileId: String("8d180057-8309-4c59-b645-f630f010ad43"), + LicenseToken: String("licenseToken"), }, }, } @@ -530,9 +528,8 @@ func verifyClusterDetailsRequest(t *testing.T, clusterDetails ClusterDetails, ap assert.Equal(t, clusterDetails.ClusterName, apiClusterDetailsReq.ClusterName, "ClusterName matches") apiClusterNodeDetailReqMap := apiClusterDetailsReq.ClusterNodeDetails assert.NotNil(t, apiClusterNodeDetailReqMap, "ClusterNodeDetails are not nil") - for k, v := range clusterDetails.ClusterNodeDetails { - verifyClusterNodeDetailRequest(t, v, apiClusterNodeDetailReqMap[k]) - } + verifyClusterNodeDetailRequest(t, clusterDetails.Node0, apiClusterNodeDetailReqMap["node0"]) + verifyClusterNodeDetailRequest(t, clusterDetails.Node1, apiClusterNodeDetailReqMap["node1"]) } func verifyClusterNodeDetailRequest(t *testing.T, clusterNodeDetail *ClusterNodeDetail, apiClusterNodeDetailReq api.ClusterNodeDetailRequest) { From 21dd5c94adc587b2f649d84347d6f9559e8eae49 Mon Sep 17 00:00:00 2001 From: Rui Ling Date: Mon, 14 Mar 2022 12:42:45 -0700 Subject: [PATCH 3/4] NFV-18410: deprecate existing fields for cluster and introduce new fields to match terraform --- client.go | 20 +++++++++++++++----- rest_device.go | 20 ++++++++++++++++---- 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/client.go b/client.go index 321d467..31ac00c 100644 --- a/client.go +++ b/client.go @@ -428,11 +428,13 @@ type DeviceLinkGroupLink struct { //ClusterDetails describes Network Edge cluster device details type ClusterDetails struct { - ClusterId *string - ClusterName *string - NumOfNodes *int - Node0 *ClusterNodeDetail - Node1 *ClusterNodeDetail + ClusterName *string + NumOfNodes *int + ClusterNodeDetails map[string]*ClusterNodeDetail // Deprecated: Use Node0 and Node1 instead + ClusterId *string + Nodes []ClusterNode // Deprecated: Use Node0 and Node1 instead + Node0 *ClusterNodeDetail + Node1 *ClusterNodeDetail } //ClusterNodeDetail describes Network Edge cluster node details @@ -443,3 +445,11 @@ type ClusterNodeDetail struct { LicenseFileId *string LicenseToken *string } + +type ClusterNode struct { // Deprecated: Use ClusterNodeDetail instead + UUID *string + Name *string + Node *int + AdminPassword *string + VendorConfiguration map[string]string +} diff --git a/rest_device.go b/rest_device.go index 7a86331..919fc84 100644 --- a/rest_device.go +++ b/rest_device.go @@ -287,16 +287,25 @@ func mapDeviceClusterDetailsAPIToDomain(apiClusterDetails *api.ClusterDetails) * clusterDetails.ClusterName = apiClusterDetails.ClusterName clusterDetails.NumOfNodes = apiClusterDetails.NumOfNodes apiNodes := apiClusterDetails.Nodes - transformed := make([]*ClusterNodeDetail, len(apiNodes)) + transformed := make([]ClusterNode, len(apiNodes)) + clusterNodeDetails := make([]*ClusterNodeDetail, len(apiNodes)) for i := range apiNodes { - transformed[i] = &ClusterNodeDetail{ + transformed[i] = ClusterNode{ + UUID: apiNodes[i].UUID, + Name: apiNodes[i].Name, + Node: apiNodes[i].Node, + AdminPassword: apiNodes[i].AdminPassword, + VendorConfiguration: apiNodes[i].VendorConfiguration, + } + clusterNodeDetails[i] = &ClusterNodeDetail{ UUID: apiNodes[i].UUID, Name: apiNodes[i].Name, VendorConfiguration: apiNodes[i].VendorConfiguration, } } - clusterDetails.Node0 = transformed[0] - clusterDetails.Node1 = transformed[1] + clusterDetails.Nodes = transformed + clusterDetails.Node0 = clusterNodeDetails[0] + clusterDetails.Node1 = clusterNodeDetails[1] return &clusterDetails } @@ -307,6 +316,9 @@ func mapDeviceClusterDetailsDomainToAPI(clusterDetails *ClusterDetails) *api.Clu req := api.ClusterDetailsRequest{} req.ClusterName = clusterDetails.ClusterName clusterNodeDetailsRequest := make(map[string]api.ClusterNodeDetailRequest) + for k, v := range clusterDetails.ClusterNodeDetails { + clusterNodeDetailsRequest[k] = *mapDeviceClusterNodeDetailDomainToAPI(v) + } clusterNodeDetailsRequest["node0"] = *mapDeviceClusterNodeDetailDomainToAPI(clusterDetails.Node0) clusterNodeDetailsRequest["node1"] = *mapDeviceClusterNodeDetailDomainToAPI(clusterDetails.Node1) req.ClusterNodeDetails = clusterNodeDetailsRequest From 0cb0844c33c050e5675572499d4e05950df1d2a3 Mon Sep 17 00:00:00 2001 From: Rui Ling Date: Tue, 15 Mar 2022 11:12:10 -0700 Subject: [PATCH 4/4] NFV-18410: resolve conversations --- rest_device.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/rest_device.go b/rest_device.go index 919fc84..1cba074 100644 --- a/rest_device.go +++ b/rest_device.go @@ -316,9 +316,6 @@ func mapDeviceClusterDetailsDomainToAPI(clusterDetails *ClusterDetails) *api.Clu req := api.ClusterDetailsRequest{} req.ClusterName = clusterDetails.ClusterName clusterNodeDetailsRequest := make(map[string]api.ClusterNodeDetailRequest) - for k, v := range clusterDetails.ClusterNodeDetails { - clusterNodeDetailsRequest[k] = *mapDeviceClusterNodeDetailDomainToAPI(v) - } clusterNodeDetailsRequest["node0"] = *mapDeviceClusterNodeDetailDomainToAPI(clusterDetails.Node0) clusterNodeDetailsRequest["node1"] = *mapDeviceClusterNodeDetailDomainToAPI(clusterDetails.Node1) req.ClusterNodeDetails = clusterNodeDetailsRequest