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{}