From 653ce6d6a646f00b9a79a3d1862d56217a3f672f Mon Sep 17 00:00:00 2001 From: yvikrant Date: Mon, 29 Nov 2021 10:52:08 -0800 Subject: [PATCH 1/3] Updated ACL Template APIs - Updated ACL template API with latest payload - Created new endoint to check device ACL status --- client.go | 17 ++++++++-- internal/api/acltemplate.go | 22 ++++++++----- internal/api/device.go | 4 +++ rest_acltemplate.go | 35 +++++++++++++++------ rest_acltemplate_test.go | 14 +++++++-- rest_device.go | 16 ++++++++++ test-fixtures/ne_acltemplate_get_resp.json | 17 +++++++--- test-fixtures/ne_acltemplates_get_resp.json | 28 +++++++++++++++-- 8 files changed, 125 insertions(+), 28 deletions(-) diff --git a/client.go b/client.go index 41ad4f6..e95a206 100644 --- a/client.go +++ b/client.go @@ -93,6 +93,7 @@ type Client interface { GetDevice(uuid string) (*Device, error) GetDevices(statuses []string) ([]Device, error) GetDeviceAdditionalBandwidthDetails(uuid string) (*DeviceAdditionalBandwidthDetails, error) + GetDeviceACLDetails(uuid string) (*DeviceACLDetails, error) NewDeviceUpdateRequest(uuid string) DeviceUpdateRequest DeleteDevice(uuid string) error @@ -346,9 +347,9 @@ type ACLTemplate struct { Name *string Description *string MetroCode *string - DeviceUUID *string DeviceACLStatus *string InboundRules []ACLTemplateInboundRule + DeviceDetails []ACLTemplateDeviceDetails } //ACLTemplateInboundRule describes inbound ACL rule that is part of @@ -356,13 +357,19 @@ type ACLTemplate struct { type ACLTemplateInboundRule struct { SeqNo *int SrcType *string - FQDN *string Subnets []string + Subnet *string Protocol *string SrcPort *string DstPort *string } +type ACLTemplateDeviceDetails struct { + UUID *string + Name *string + ACLStatus *string +} + //DeviceAdditionalBandwidthDetails describes details of a device //additional badwidth type DeviceAdditionalBandwidthDetails struct { @@ -370,6 +377,12 @@ type DeviceAdditionalBandwidthDetails struct { Status *string } +//DeviceACLDetails describes details of a device +//additional badwidth +type DeviceACLDetails struct { + Status *string +} + //DeviceLinkGroup describes details of a device link group type DeviceLinkGroup struct { UUID *string diff --git a/internal/api/acltemplate.go b/internal/api/acltemplate.go index d7428a0..16d53fc 100644 --- a/internal/api/acltemplate.go +++ b/internal/api/acltemplate.go @@ -2,13 +2,13 @@ package api //ACLTemplate describes Network Edge device ACL template type ACLTemplate struct { - UUID *string `json:"uuid,omitempty"` - Name *string `json:"name,omitempty"` - Description *string `json:"description,omitempty"` - MetroCode *string `json:"metroCode,omitempty"` - VirtualDeviceUUID *string `json:"virtualDeviceUuid,omitempty"` - DeviceACLStatus *string `json:"deviceAclstatus,omitempty"` - InboundRules []ACLTemplateInboundRule `json:"inboundRules,omitempty"` + UUID *string `json:"uuid,omitempty"` + Name *string `json:"name,omitempty"` + Description *string `json:"description,omitempty"` + MetroCode *string `json:"metroCode,omitempty"` + DeviceACLStatus *string `json:"deviceAclstatus,omitempty"` + InboundRules []ACLTemplateInboundRule `json:"inboundRules,omitempty"` + DeviceDetails []ACLTemplateDeviceDetails `json:"virtualDeviceDetails,omitempty"` } //ACLTemplateInboundRule describes inbound ACL rule that is part of @@ -18,11 +18,17 @@ type ACLTemplateInboundRule struct { Protocol *string `json:"protocol,omitempty"` SrcPort *string `json:"srcPort,omitempty"` DstPort *string `json:"dstPort,omitempty"` - FQDN *string `json:"fqdn,omitempty"` Subnets []string `json:"subnets,omitempty"` + Subnet *string `json:"subnet,omitempty"` SeqNO *int `json:"seqNo,omitempty"` } +type ACLTemplateDeviceDetails struct { + UUID *string `json:"uuid,omitempty"` + Name *string `json:"name,omitempty"` + ACLStatus *string `json:"aclStatus,omitempty"` +} + //ACLTemplatesResponse describes response for a get ACL template collection request type ACLTemplatesResponse struct { Pagination Pagination `json:"pagination,omitempty"` diff --git a/internal/api/device.go b/internal/api/device.go index 7692b4a..10ed09e 100644 --- a/internal/api/device.go +++ b/internal/api/device.go @@ -155,3 +155,7 @@ type DeviceAdditionalBandwidthResponse struct { AdditionalBandwidth *int `json:"additionalBandwidth,omitempty"` Status *string `json:"status,omitempty"` } + +type DeviceACLResponse struct { + Status *string `json:"status,omitempty"` +} diff --git a/rest_acltemplate.go b/rest_acltemplate.go index cda557d..837f6f3 100644 --- a/rest_acltemplate.go +++ b/rest_acltemplate.go @@ -81,13 +81,12 @@ func (c RestClient) DeleteACLTemplate(uuid string) error { func mapACLTemplateDomainToAPI(template ACLTemplate) api.ACLTemplate { return api.ACLTemplate{ - UUID: template.UUID, - Name: template.Name, - Description: template.Description, - MetroCode: template.MetroCode, - VirtualDeviceUUID: template.DeviceUUID, - DeviceACLStatus: template.DeviceACLStatus, - InboundRules: mapACLTemplateInboundRulesDomainToAPI(template.InboundRules), + UUID: template.UUID, + Name: template.Name, + Description: template.Description, + MetroCode: template.MetroCode, + DeviceACLStatus: template.DeviceACLStatus, + InboundRules: mapACLTemplateInboundRulesDomainToAPI(template.InboundRules), } } @@ -105,7 +104,7 @@ func mapACLTemplateInboundRuleDomainToAPI(rule ACLTemplateInboundRule) api.ACLTe Protocol: rule.Protocol, SrcPort: rule.SrcPort, DstPort: rule.DstPort, - FQDN: rule.FQDN, + Subnet: rule.Subnet, Subnets: rule.Subnets, SeqNO: rule.SeqNo, } @@ -117,9 +116,9 @@ func mapACLTemplateAPIToDomain(apiTemplate api.ACLTemplate) ACLTemplate { Name: apiTemplate.Name, Description: apiTemplate.Description, MetroCode: apiTemplate.MetroCode, - DeviceUUID: apiTemplate.VirtualDeviceUUID, DeviceACLStatus: apiTemplate.DeviceACLStatus, InboundRules: mapACLTemplateInboundRulesAPIToDomain(apiTemplate.InboundRules), + DeviceDetails: mapACLTemplateDeviceDetailsAPIToDomain(apiTemplate.DeviceDetails), } } @@ -137,8 +136,24 @@ func mapACLTemplateInboundRuleAPIToDomain(apiRule api.ACLTemplateInboundRule) AC Protocol: apiRule.Protocol, SrcPort: apiRule.SrcPort, DstPort: apiRule.DstPort, - FQDN: apiRule.FQDN, Subnets: apiRule.Subnets, + Subnet: apiRule.Subnet, SeqNo: apiRule.SeqNO, } } + +func mapACLTemplateDeviceDetailsAPIToDomain(apiRules []api.ACLTemplateDeviceDetails) []ACLTemplateDeviceDetails { + transformed := make([]ACLTemplateDeviceDetails, len(apiRules)) + for i := range apiRules { + transformed[i] = mapACLTemplateDeviceDetailAPIToDomain(apiRules[i]) + } + return transformed +} + +func mapACLTemplateDeviceDetailAPIToDomain(apiRule api.ACLTemplateDeviceDetails) ACLTemplateDeviceDetails { + return ACLTemplateDeviceDetails{ + UUID: apiRule.UUID, + Name: apiRule.Name, + ACLStatus: apiRule.ACLStatus, + } +} diff --git a/rest_acltemplate_test.go b/rest_acltemplate_test.go index 1575e04..15ea3da 100644 --- a/rest_acltemplate_test.go +++ b/rest_acltemplate_test.go @@ -93,6 +93,7 @@ func TestGetACLTemplates(t *testing.T) { assert.Equal(t, len(respBody.Data), len(templates), "Number of objects matches") for i := range respBody.Data { verifyACLTemplate(t, templates[i], respBody.Data[i]) + verifyACLTemplateDeviceDetails(t, templates[i], respBody.Data[i]) } } @@ -114,6 +115,7 @@ func TestGetACLTemplate(t *testing.T) { assert.NotNil(t, template, "Returned template is not nil") assert.Nil(t, err, "Error is not returned") verifyACLTemplate(t, *template, resp) + verifyACLTemplateDeviceDetails(t, *template, resp) } func TestReplaceACLTemplate(t *testing.T) { @@ -164,7 +166,6 @@ func verifyACLTemplate(t *testing.T, template ACLTemplate, apiTemplate api.ACLTe assert.Equal(t, template.Name, apiTemplate.Name, "Name matches") assert.Equal(t, template.Description, apiTemplate.Description, "Description matches") assert.Equal(t, template.MetroCode, apiTemplate.MetroCode, "MetroCode matches") - assert.Equal(t, template.DeviceUUID, apiTemplate.VirtualDeviceUUID, "DeviceUUID matches") assert.Equal(t, template.DeviceACLStatus, apiTemplate.DeviceACLStatus, "DeviceACLStatus matches") assert.Equal(t, len(template.InboundRules), len(apiTemplate.InboundRules), "Number of InboundRules matches") for i := range template.InboundRules { @@ -175,9 +176,18 @@ func verifyACLTemplate(t *testing.T, template ACLTemplate, apiTemplate api.ACLTe func verifyACLTemplateInboundRule(t *testing.T, rule ACLTemplateInboundRule, apiRule api.ACLTemplateInboundRule) { assert.Equal(t, rule.SeqNo, rule.SeqNo, "SeqNo matches") assert.Equal(t, rule.SrcType, rule.SrcType, "SrcType matches") - assert.Equal(t, rule.FQDN, rule.FQDN, "FQDN matches") assert.ElementsMatch(t, rule.Subnets, rule.Subnets, "Subnets matches") assert.Equal(t, rule.Protocol, rule.Protocol, "Protocol matches") assert.Equal(t, rule.SrcPort, rule.SrcPort, "SrcPort matches") assert.Equal(t, rule.DstPort, rule.DstPort, "DstPort matches") } + +func verifyACLTemplateDeviceDetails(t *testing.T, template ACLTemplate, apiTemplate api.ACLTemplate) { + assert.Equal(t, len(template.DeviceDetails), len(apiTemplate.DeviceDetails), "Number of DeviceDetails matches") + for i := range template.DeviceDetails { + assert.Equal(t, template.DeviceDetails[i].UUID, apiTemplate.DeviceDetails[i].UUID, "UUID matches") + assert.Equal(t, template.DeviceDetails[i].Name, apiTemplate.DeviceDetails[i].Name, "Name matches") + assert.Equal(t, template.DeviceDetails[i].ACLStatus, apiTemplate.DeviceDetails[i].ACLStatus, "ACL Status matches") + + } +} diff --git a/rest_device.go b/rest_device.go index 7618335..2b45600 100644 --- a/rest_device.go +++ b/rest_device.go @@ -97,6 +97,16 @@ func (c RestClient) GetDeviceAdditionalBandwidthDetails(uuid string) (*DeviceAdd return mapDeviceAdditionalBandwidthAPIToDomain(result), nil } +func (c RestClient) GetDeviceACLDetails(uuid string) (*DeviceACLDetails, error) { + path := fmt.Sprintf("/ne/v1/devices/%s/acl", url.PathEscape(uuid)) + result := api.DeviceACLResponse{} + request := c.R().SetResult(&result) + if err := c.Execute(request, http.MethodGet, path); err != nil { + return nil, err + } + return mapDeviceACLAPIToDomain(result), nil +} + //NewDeviceUpdateRequest creates new composite update request for a device with a given UUID func (c RestClient) NewDeviceUpdateRequest(uuid string) DeviceUpdateRequest { return &restDeviceUpdateRequest{ @@ -393,3 +403,9 @@ func mapDeviceAdditionalBandwidthAPIToDomain(apiDetails api.DeviceAdditionalBand Status: apiDetails.Status, } } + +func mapDeviceACLAPIToDomain(apiDetails api.DeviceACLResponse) *DeviceACLDetails { + return &DeviceACLDetails{ + Status: apiDetails.Status, + } +} diff --git a/test-fixtures/ne_acltemplate_get_resp.json b/test-fixtures/ne_acltemplate_get_resp.json index c86d31b..51c7789 100644 --- a/test-fixtures/ne_acltemplate_get_resp.json +++ b/test-fixtures/ne_acltemplate_get_resp.json @@ -4,7 +4,6 @@ "description": "Test ACL", "inboundRules": [ { - "srcType": "SUBNET", "seqNo": 1, "subnets": [ "10.0.0.0/24" @@ -27,9 +26,19 @@ ], "metroName": "Silicon Valley", "metroCode": "SV", - "virtualDeviceName": "csr1000v-n", - "virtualDeviceUUID": "4ad6ab9c-f470-4dae-a445-926424785e2f", "deviceAclstatus": "PROVISIONED", "createdBy": "user", - "createdDate": "2020-10-29T09:58:05.012Z" + "createdDate": "2020-10-29T09:58:05.012Z", + "virtualDeviceDetails": [ + { + "name": "test_device1", + "uuid": "7e9bf92a-2189-4474-a181-81039c0ccfb1", + "aclStatus": "PROVISIONED" + }, + { + "name": "test_device2", + "uuid": "e54ba802-29c5-4741-a1e5-81c89ca1f172", + "aclStatus": "PROVISIONED" + } + ] } \ No newline at end of file diff --git a/test-fixtures/ne_acltemplates_get_resp.json b/test-fixtures/ne_acltemplates_get_resp.json index 92df1c2..c84f863 100644 --- a/test-fixtures/ne_acltemplates_get_resp.json +++ b/test-fixtures/ne_acltemplates_get_resp.json @@ -28,7 +28,19 @@ "virtualDeviceUUID": "", "deviceAclstatus": "", "createdBy": "user", - "createdDate": "2020-10-05T21:19:15.912Z" + "createdDate": "2020-10-05T21:19:15.912Z", + "virtualDeviceDetails": [ + { + "name": "test_device1", + "uuid": "7e9bf92a-2189-4474-a181-81039c0ccfb1", + "aclStatus": "PROVISIONED" + }, + { + "name": "test_device2", + "uuid": "e54ba802-29c5-4741-a1e5-81c89ca1f172", + "aclStatus": "PROVISIONED" + } + ] }, { "name": "test-twp", @@ -52,7 +64,19 @@ "virtualDeviceUUID": "35400805-1c84-46db-acd2-796273b86662", "deviceAclstatus": "PROVISIONED", "createdBy": "user", - "createdDate": "2020-10-05T02:31:38.867Z" + "createdDate": "2020-10-05T02:31:38.867Z", + "virtualDeviceDetails": [ + { + "name": "test_device1", + "uuid": "7e9bf92a-2189-4474-a181-81039c0ccfb1", + "aclStatus": "PROVISIONED" + }, + { + "name": "test_device2", + "uuid": "e54ba802-29c5-4741-a1e5-81c89ca1f172", + "aclStatus": "PROVISIONED" + } + ] } ] } \ No newline at end of file From 039f98080c7b183a72fd72d22c57ba74844bfb61 Mon Sep 17 00:00:00 2001 From: yvikrant Date: Tue, 30 Nov 2021 12:19:27 -0800 Subject: [PATCH 2/3] Added comments and marked properties as deprecated --- client.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/client.go b/client.go index e95a206..281a979 100644 --- a/client.go +++ b/client.go @@ -346,7 +346,7 @@ type ACLTemplate struct { UUID *string Name *string Description *string - MetroCode *string + MetroCode *string // Deprecated: Metro code is not required as template can be used for multiple devices across metros. DeviceACLStatus *string InboundRules []ACLTemplateInboundRule DeviceDetails []ACLTemplateDeviceDetails @@ -356,14 +356,15 @@ type ACLTemplate struct { //Network Edge device ACL template type ACLTemplateInboundRule struct { SeqNo *int - SrcType *string - Subnets []string + SrcType *string // Deprecated: SrcType is not required. + Subnets []string // Deprecated: Use subnet instead. Subnet *string Protocol *string SrcPort *string DstPort *string } +//ACLTemplateDeviceDetails describes Device Details this template applied to type ACLTemplateDeviceDetails struct { UUID *string Name *string From b6fbf1842b3b4c2e6d07acaf2e1540bd941931ba Mon Sep 17 00:00:00 2001 From: yvikrant Date: Wed, 1 Dec 2021 11:35:04 -0800 Subject: [PATCH 3/3] Added comments and marked properties as deprecated --- client.go | 2 ++ internal/api/acltemplate.go | 15 ++++++++------- rest_device.go | 1 + 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/client.go b/client.go index 281a979..180b7f0 100644 --- a/client.go +++ b/client.go @@ -346,6 +346,7 @@ type ACLTemplate struct { UUID *string Name *string Description *string + DeviceUUID *string // Deprecated: Refer to DeviceDetails for more information MetroCode *string // Deprecated: Metro code is not required as template can be used for multiple devices across metros. DeviceACLStatus *string InboundRules []ACLTemplateInboundRule @@ -356,6 +357,7 @@ type ACLTemplate struct { //Network Edge device ACL template type ACLTemplateInboundRule struct { SeqNo *int + FQDN *string // Deprecated: FQDN is no longer supported SrcType *string // Deprecated: SrcType is not required. Subnets []string // Deprecated: Use subnet instead. Subnet *string diff --git a/internal/api/acltemplate.go b/internal/api/acltemplate.go index 16d53fc..2a871d5 100644 --- a/internal/api/acltemplate.go +++ b/internal/api/acltemplate.go @@ -2,13 +2,14 @@ package api //ACLTemplate describes Network Edge device ACL template type ACLTemplate struct { - UUID *string `json:"uuid,omitempty"` - Name *string `json:"name,omitempty"` - Description *string `json:"description,omitempty"` - MetroCode *string `json:"metroCode,omitempty"` - DeviceACLStatus *string `json:"deviceAclstatus,omitempty"` - InboundRules []ACLTemplateInboundRule `json:"inboundRules,omitempty"` - DeviceDetails []ACLTemplateDeviceDetails `json:"virtualDeviceDetails,omitempty"` + UUID *string `json:"uuid,omitempty"` + Name *string `json:"name,omitempty"` + Description *string `json:"description,omitempty"` + MetroCode *string `json:"metroCode,omitempty"` + VirtualDeviceUUID *string `json:"virtualDeviceUuid,omitempty"` + DeviceACLStatus *string `json:"deviceAclstatus,omitempty"` + InboundRules []ACLTemplateInboundRule `json:"inboundRules,omitempty"` + DeviceDetails []ACLTemplateDeviceDetails `json:"virtualDeviceDetails,omitempty"` } //ACLTemplateInboundRule describes inbound ACL rule that is part of diff --git a/rest_device.go b/rest_device.go index 2b45600..4e13faf 100644 --- a/rest_device.go +++ b/rest_device.go @@ -97,6 +97,7 @@ func (c RestClient) GetDeviceAdditionalBandwidthDetails(uuid string) (*DeviceAdd return mapDeviceAdditionalBandwidthAPIToDomain(result), nil } +//GetDeviceACLDetails retrives device acl template provisioning status func (c RestClient) GetDeviceACLDetails(uuid string) (*DeviceACLDetails, error) { path := fmt.Sprintf("/ne/v1/devices/%s/acl", url.PathEscape(uuid)) result := api.DeviceACLResponse{}