diff --git a/hnv_client/client.py b/hnv_client/client.py index 10c326f..6e7a65e 100644 --- a/hnv_client/client.py +++ b/hnv_client/client.py @@ -61,12 +61,25 @@ class _BaseHNVModel(model.Model): is associated with network objects that are ancestors of the parent of the necessary resource.""" + operation_id = model.Field(name="operation_id", key="operation-id", + is_property=False, is_required=False, + is_read_only=True) + """The value of the x-ms-request-id header returned by the resource + provider.""" + instance_id = model.Field(name="instance_id", key="instanceId", is_property=False) """The globally unique Id generated and used internally by the Network Controller. The mapping resource that enables the client to map between the instanceId and the resourceId.""" + resource_metadata = model.Field(name="resource_metadata", + key="resourceMetadata", + is_property=False, is_required=False) + """Structured data that the client provides to the server. This is an + optional element but it is suggested that all clients fill in the data + that is applicable to them.""" + etag = model.Field(name="etag", key="etag", is_property=False) """An opaque string representing the state of the resource at the time the response was generated.""" @@ -196,6 +209,16 @@ class _BaseHNVModel(model.Model): # Lock the current model self._provision_done = True + @classmethod + def from_raw_data(cls, raw_data): + """Create a new model using raw API response.""" + raw_metadata = raw_data.get("resourceMetadata", None) + if raw_metadata is not None: + metadata = ResourceMetadata.from_raw_data(raw_metadata) + raw_data["resourceMetadata"] = metadata + + return super(_BaseHNVModel, cls).from_raw_data(raw_data) + class Resource(model.Model): @@ -206,6 +229,47 @@ class Resource(model.Model): """A relative URI to an associated resource.""" +class ResourceMetadata(model.Model): + + """Model for Resource Metadata. + + Structured data that the client provides to the server. This is an + optional element but it is suggested that all clients fill in the + data that is applicable to them. + """ + + client = model.Field(name="client", key="client", + is_property=False, is_required=False) + """Indicates the client that creates or updates the resource. + Although this element is optional, it is strongly recommended that it + contain an appropriate value.""" + + tenant_id = model.Field(name="tenant_id", key="tenantId", + is_property=False, is_required=False) + """The identifier of the tenant in the client environment. + Provides linkage between the resource in the Network Controller + and the tenant in the client network.""" + + group_id = model.Field(name="group_id", key="groupId", + is_property=False, is_required=False) + """The identifier of the group that the tenant belongs to within + the client environment. This is usually used in environments that + contain multiple tenants that are aggregated into groups that the + client manages. This provides linkage between the resource in the + Network Controller and the group that the tenant belongs to in the + client network.""" + + resource_name = model.Field(name="resource_name", key="name", + is_property=False, is_required=False) + """Indicates the globally unique name of the resource. If it + is not assigned a value then it will be blank.""" + + original_href = model.Field(name="original_href", key="originalHref", + is_property=False, is_required=False) + """The original URI of the resource if the client uses a URI based + system to organize resources.""" + + class IPPools(_BaseHNVModel): """Model for IP Pools. @@ -281,7 +345,7 @@ class LogicalSubnetworks(_BaseHNVModel): address_prefix = model.Field(name="address_prefix", key="addressPrefix") """Identifies the subnet id in form of ipAddresss/prefixlength.""" - vlan_id = model.Field(name="vlan_id", key="vlanId", is_required=True, + vlan_id = model.Field(name="vlan_id", key="vlanID", is_required=True, default=0) """Indicates the VLAN ID associated with the logical subnet.""" @@ -297,6 +361,11 @@ class LogicalSubnetworks(_BaseHNVModel): """Indicates one or more DNS servers that are used for resolving DNS queries by devices or host connected to this logical subnet.""" + ip_configurations = model.Field(name="ip_configurations", + key="ipConfigurations") + """Indicates an array of IP configurations that are contained + in the network interface.""" + network_interfaces = model.Field(name="network_interfaces", key="networkInterfaces", is_read_only=True) @@ -311,6 +380,13 @@ class LogicalSubnetworks(_BaseHNVModel): key="defaultGateways") """A collection of one or more gateways for the subnet.""" + gateway_pools = model.Field(name="gateway_pools", key="gatewayPools", + is_required=False, is_read_only=True) + """Indicates a collection of references to gatewayPools resources + in which connections can be created. This information is populated + at the time of subscription and can be changed only via the Service + administrator portal.""" + @classmethod def from_raw_data(cls, raw_data): """Create a new model using raw API response.""" @@ -322,6 +398,13 @@ class LogicalSubnetworks(_BaseHNVModel): ip_pools.append(IPPools.from_raw_data(raw_ip_pool)) properties["ipPools"] = ip_pools + ip_configurations = [] + raw_settings = properties.get("ipConfigurations", []) + for raw_configuration in raw_settings: + ip_configuration = IPConfiguration.from_raw_data(raw_configuration) + ip_configurations.append(ip_configuration) + properties["ipConfigurations"] = ip_configurations + return super(LogicalSubnetworks, cls).from_raw_data(raw_data) @@ -370,3 +453,288 @@ class LogicalNetworks(_BaseHNVModel): properties["virtualNetworks"] = virtual_networks return super(LogicalNetworks, cls).from_raw_data(raw_data) + + +class IPConfiguration(_BaseHNVModel): + + """IP Configuration Model. + + This resource represents configuration information for IP addresses: + allocation method, actual IP address, membership of a logical or virtual + subnet, load balancing and access control information. + """ + + _endpoint = ("/networking/v1/networkInterfaces/{parent_id}" + "/ipConfigurations/{resource_id}") + + parent_id = model.Field(name="parent_id", + key="parentResourceID", + is_property=False, is_required=True, + is_read_only=True) + """The parent resource ID field contains the resource ID that is + associated with network objects that are ancestors of the necessary + resource. + """ + + access_controll_list = model.Field(name="access_controll_list", + key="accessControlList", + is_required=False) + """Indicates a reference to an accessControlList resource that defines + the ACLs in and out of the IP Configuration.""" + + backend_address_pools = model.Field( + name="backend_address_pools", key="loadBalancerBackendAddressPools", + is_required=False, is_read_only=True) + """Reference to backendAddressPools child resource of loadBalancers + resource.""" + + inbound_nat_rules = model.Field( + name="loadBalancerInboundNatRules", key="loadBalancerInboundNatRules", + is_required=False) + """Reference to inboundNatRules child resource of loadBalancers + resource.""" + + private_ip_address = model.Field( + name="private_ip_address", key="privateIPAddress", + is_required=False) + """Indicates the private IP address of the IP Configuration.""" + + private_ip_allocation_method = model.Field( + name="private_ip_allocation_method", key="privateIPAllocationMethod", + is_required=False) + """Indicates the allocation method (Static or Dynamic).""" + + public_ip_address = model.Field( + name="public_ip_address", key="privateIpAddress", + is_required=False) + """Indicates the public IP address of the IP Configuration.""" + + service_insertion = model.Field( + name="service_insertion", key="serviceInsertion", + is_required=False) + """Indicates a reference to a serviceInsertion resource that defines + the service insertion in and out of the IP Configuration.""" + + subnet = model.Field(name="subnet", key="subnet", is_read_only=True) + """Indicates a reference to the subnet resource that the IP Configuration + is connected to.""" + + +class DNSSettings(model.Model): + + """Model for DNS Setting for Network Interfaces.""" + + dns_servers = model.Field(name="dns_servers", key="dnsServers", + is_property=False, is_required=False) + """Indicates an array of IP Addresses that the network interface + resource will use for the DNS servers.""" + + +class QosSettings(model.Model): + + """Qos Settings Model.""" + + outbound_reserved_value = model.Field(name="outbound_reserved_value", + key="outboundReservedValue", + is_required=False, + is_property=False) + """If outboundReservedMode is "absolute" then the value indicates the + bandwidth, in Mbps, guaranteed to the virtual port for transmission + (egress).""" + + outbound_maximum_mbps = model.Field(name="outbound_maximum_mbps", + key="outboundMaximumMbps", + is_required=False, + is_property=False) + """Indicates the maximum permitted send-side bandwidth, in Mbps, + for the virtual port (egress).""" + + inbound_maximum_mbps = model.Field(name="inbound_maximum_mbps", + key="inboundMaximumMbps", + is_required=False, + is_property=False) + """Indicates the maximum permitted receive-side bandwidth for the + virtual port (ingress) in Mbps.""" + + +class PortSettings(model.Model): + + """Port Settings Model.""" + + mac_spoofing = model.Field(name="mac_spoofing", key="macSpoofingEnabled", + is_required=False, is_property=False) + """Specifies whether virtual machines can change the source MAC + address in outgoing packets to one not assigned to them.""" + + arp_guard = model.Field(name="arp_guard", key="arpGuardEnabled", + is_required=False, is_property=False) + """Specifies whether ARP guard is enabled or not. ARP guard + will allow only addresses specified in ArpFilter to pass through + the port.""" + + dhcp_guard = model.Field(name="dhcp_guard", key="dhcpGuardEnabled", + is_required=False, is_property=False) + """Specifies the number of broadcast, multicast, and unknown + unicast packets per second a virtual machine is allowed to + send through the specified virtual network adapter.""" + + storm_limit = model.Field(name="storm_limit", key="stormLimit", + is_required=False, is_property=False) + """Specifies the number of broadcast, multicast, and unknown + unicast packets per second a virtual machine is allowed to + send through the specified virtual network adapter.""" + + port_flow_limit = model.Field(name="port_flow_limit", + key="portFlowLimit", + is_required=False, is_property=False) + """Specifies the maximum number of flows that can be executed + for the port.""" + + vmq_weight = model.Field(name="vmq_weight", key="vmqWeight", + is_required=False, is_property=False) + """Specifies whether virtual machine queue (VMQ) is to be + enabled on the virtual network adapter.""" + + iov_weight = model.Field(name="iov_weight", key="iovWeight", + is_required=False, is_property=False) + """Specifies whether single-root I/O virtualization (SR-IOV) is to + be enabled on this virtual network adapter.""" + + iov_interrupt_moderation = model.Field(name="iov_interrupt_moderation", + key="iovInterruptModeration", + is_required=False, + is_property=False) + """Specifies the interrupt moderation value for a single-root I/O + virtualization (SR-IOV) virtual function assigned to a virtual + network adapter.""" + + iov_queue_pairs = model.Field(name="iov_queue_pairs", + key="iovQueuePairsRequested", + is_required=False, is_property=False) + """Specifies the number of hardware queue pairs to be allocated + to an SR-IOV virtual function.""" + + qos_settings = model.Field(name="qos_settings", key="qosSettings", + is_required=False, is_property=False) + + @classmethod + def from_raw_data(cls, raw_data): + """Create a new model using raw API response.""" + raw_settings = raw_data.get("qosSettings", {}) + qos_settings = QosSettings.from_raw_data(raw_settings) + raw_data["qosSettings"] = qos_settings + return super(PortSettings, cls).from_raw_data(raw_data) + + +class ConfigurationState(model.Model): + + """Model for configuration state.""" + + uuid = model.Field(name="uuid", key="id", + is_property=False, is_required=False) + status = model.Field(name="status", key="status", + is_property=False, is_required=False) + last_update = model.Field(name="last_update", key="lastUpdatedTime", + is_property=False, is_required=False) + detailed_info = model.Field(name="detailed_info", key="detailedInfo", + is_property=False, is_required=False) + interface_errors = model.Field(name="interface_errors", + key="virtualNetworkInterfaceErrors", + is_property=False, is_required=False) + host_errors = model.Field(name="host_erros", key="hostErrors", + is_property=False, is_required=False) + + +class NetworkInterfaces(_BaseHNVModel): + + """Network Interface Model. + + The networkInterfaces resource specifies the configuration of either + a host virtual interface (host vNIC) or a virtual server NIC (VMNIC). + """ + + _endpoint = "/networking/v1/networkInterfaces/{resource_id}" + + configuration_state = model.Field(name="configuration_state", + key="configurationState", + is_read_only=True, is_required=False) + + dns_settings = model.Field(name="dns_settings", key="dnsSettings", + is_read_only=False) + """Indicates the DNS settings of this network interface.""" + + ip_configurations = model.Field(name="ip_configurations", + key="ipConfigurations") + """Indicates an array of IP configurations that are contained + in the network interface.""" + + is_host = model.Field(name="is_host", + key="isHostVirtualNetworkInterface") + """True if this is a host virtual interface (host vNIC) + False if this is a virtual server NIC (VMNIC).""" + + is_primary = model.Field(name="is_primary", key="isPrimary", + default=True, is_static=True) + """`True` if this is the primary interface and the default + value if the property is not set or `False` if this is a + secondary interface.""" + + is_multitenant_stack = model.Field(name="is_multitenant_stack", + key="isMultitenantStack", + default=False) + """`True` if allows the NIC to be part of multiple virtual networks + or `False` if the opposite.""" + + internal_dns_name = model.Field(name="internal_dns_name", + key="internalDnsNameLabel") + """Determines the name that will be registered in iDNS + when the iDnsServer resource is configured.""" + + server = model.Field(name="server", key="server", + is_read_only=True) + """Indicates a reference to the servers resource for the + machine that is currently hosting the virtual machine to + which this network interface belongs.""" + + port_settings = model.Field(name="port_settings", key="portSettings") + """A PortSettings object.""" + + mac_address = model.Field(name="mac_address", key="privateMacAddress") + """Indicates the private MAC address of this network interface.""" + + mac_allocation_method = model.Field(name="mac_allocation_method", + key="privateMacAllocationMethod") + """Indicates the allocation scheme of the MAC for this + network interface.""" + + service_insertion_elements = model.Field( + name="service_insertion_elements", key="serviceInsertionElements", + is_read_only=True) + """Indicates an array of serviceInsertions resources that + this networkInterfaces resource is part of.""" + + @classmethod + def from_raw_data(cls, raw_data): + """Create a new model using raw API response.""" + properties = raw_data["properties"] + + ip_configurations = [] + raw_settings = properties.get("ipConfigurations", []) + for raw_configuration in raw_settings: + ip_configuration = IPConfiguration.from_raw_data(raw_configuration) + ip_configurations.append(ip_configuration) + properties["ipConfigurations"] = ip_configurations + + raw_settings = properties.get("dnsSettings", {}) + dns_settings = DNSSettings.from_raw_data(raw_settings) + properties["dnsSettings"] = dns_settings + + raw_settings = properties.get("portSettings", {}) + port_settings = PortSettings.from_raw_data(raw_settings) + properties["portSettings"] = port_settings + + raw_state = properties.get("configurationState", {}) + configuration = ConfigurationState.from_raw_data(raw_state) + properties["configurationState"] = configuration + + return super(NetworkInterfaces, cls).from_raw_data(raw_data) diff --git a/hnv_client/tests/fake/fake_response.py b/hnv_client/tests/fake/fake_response.py index 27be09e..cb9f7a8 100644 --- a/hnv_client/tests/fake/fake_response.py +++ b/hnv_client/tests/fake/fake_response.py @@ -45,3 +45,11 @@ class FakeResponse(object): def ip_pools(self): """Fake GET(all) response for IP pools.""" return self._load_resource("ip_pools.json") + + def network_interfaces(self): + """Fake GET(all) response for network interfaces.""" + return self._load_resource("network_interfaces.json") + + def ip_configurations(self): + """Fake GET(all) response for ip configurations.""" + return self._load_resource("ip_configurations.json") diff --git a/hnv_client/tests/fake/response/ip_configurations.json b/hnv_client/tests/fake/response/ip_configurations.json new file mode 100644 index 0000000..909a394 --- /dev/null +++ b/hnv_client/tests/fake/response/ip_configurations.json @@ -0,0 +1,24 @@ +{ + "value": [ + { + "resourceRef": "/networkInterfaces/ee9be550-4dd3-43af-9b69-8a45f1ef3569 /ipConfigurations/c1fe8acf-cf68-45f0-bc70-f9a1cd8d3953", + "resourceId": "c1fe8acf-cf68-45f0-bc70-f9a1cd8d3953", + "etag": "W/\"d728c292-9499-497b-a328-0216b50e7f21\"", + "instanceId": "2d254540-9c81-4216-8da6-44d498061040", + "properties": { + "provisioningState": "Succeeded", + "privateIPAddress": "20.168.0.26", + "privateIPAllocationMethod": "Static", + "subnet": { + "resourceRef": "/virtualNetworks/29d028bc-a244-4bec-b3bb-958ea0c64681 /subnets/c0f6d801-ca07-4345-8274-20b13454c51a" + }, + "accessControlList": { + "resourceRef": "/accessControlLists/28f4e1fc-2d3a-41c0-97f2-261be40bda77" + }, + "loadBalancerBackendAddressPools": [], + "loadBalancerInboundNatRules": [] + } + } + ], + "nextLink": "" +} diff --git a/hnv_client/tests/fake/response/ip_pools.json b/hnv_client/tests/fake/response/ip_pools.json index 34b9ab9..33630ce 100644 --- a/hnv_client/tests/fake/response/ip_pools.json +++ b/hnv_client/tests/fake/response/ip_pools.json @@ -1,51 +1,21 @@ { "value": [ { - "resourceId": "{uniqueString}", - "etag": "00000000-0000-0000-0000-000000000000", - "instanceId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX", - "tags": { - "key": "value" - }, - "resourceMetadata": { - "client": "", - "tenantId": "{subscriptionid}", - "groupId": "{groupname}", - "name": "{name}", - "originalHref": "https://..." - }, + "resourceRef": "/logicalnetworks/a647c7f3-9203-44df-a15e-bfff856c83d7 /subnets/d1078059-fe58-4c26-bdce-9bf61e0d2be2/ipPools/9176fa09-48ca-4e0e-b953- c9c065561e03", + "resourceId": "9176fa09-48ca-4e0e-b953-c9c065561e03", + "etag": "W/\"fd2b18a6-f142-494c-adee-fb244cd7245d\"", + "instanceId": "10080cf6-504d-4e6c-bf22-d2b90bd51090", "properties": { - "provisioningState": "Updating|Deleting|Failed|Succeeded", - "ipConfigurations": [], - "networkInterfaces": [], - "vlanID": "1", - "routes": [], - "dnsServers": [ - "10.0.0.1", - "10.0.0.2" - ], - "defaultGateways": [ - "192.168.1.1", - "192.168.1.2" - ], - "isPublic": true, - "ipPools": [] - } - }, - { - "resourceId": "{uniqueString}", - "etag": "00000000-0000-0000-0000-000000000000", - "instanceId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX", - "tags": { - "key": "value" - }, - "resourceMetadata": { - "client": "", - "tenantId": "{subscriptionid}", - "groupId": "{groupname}", - "name": "{name}", - "originalHref": "https://..." + "provisioningState": "Succeeded", + "startIpAddress": "15.65.2.100", + "endIpAddress": "15.65.2.255", + "usage": { + "numberOfIPAddresses": 156, + "numberofIPAddressesAllocated": 0, + "numberOfIPAddressesInTransition": 0 + } } } - ] -} \ No newline at end of file + ], + "nextLink": "" +} diff --git a/hnv_client/tests/fake/response/logical_networks.json b/hnv_client/tests/fake/response/logical_networks.json index 155a324..baef993 100644 --- a/hnv_client/tests/fake/response/logical_networks.json +++ b/hnv_client/tests/fake/response/logical_networks.json @@ -23,7 +23,6 @@ } ], "gatewayPools": [], - "networkConnections": [], "vlanID": "109", "ipPools": [ { @@ -53,12 +52,7 @@ "defaultGateways": [ "192.83.0.1" ], - "isPublic": false, - "usage": { - "numberOfIPAddresses": 65445, - "numberofIPAddressesAllocated": 2, - "numberOfIPAddressesInTransition": 0 - } + "isPublic": false } } ], diff --git a/hnv_client/tests/fake/response/network_interfaces.json b/hnv_client/tests/fake/response/network_interfaces.json new file mode 100644 index 0000000..8c6bbd5 --- /dev/null +++ b/hnv_client/tests/fake/response/network_interfaces.json @@ -0,0 +1,831 @@ +{ + "value": [ + { + "resourceRef": "/networkInterfaces/00000000-3333-0000-0000-000000000001", + "resourceId": "00000000-3333-0000-0000-000000000001", + "etag": "W/\"f2bf845b-a81a-4148-9971-501fc017ffb0\"", + "instanceId": "2c784cfe-47f4-499c-ab27-905cfad0fb22", + "properties": { + "provisioningState": "Succeeded", + "dnsSettings": {}, + "privateMacAddress": "00FFFF009B80", + "privateMacAllocationMethod": "Static", + "serviceInsertionElements": [], + "portSettings": { + "macSpoofingEnabled": "Disabled", + "arpGuardEnabled": "Disabled", + "dhcpGuardEnabled": "Disabled", + "stormLimit": 0, + "portFlowLimit": 0, + "iovWeight": 0, + "iovInterruptModeration": "Off", + "iovQueuePairsRequested": 0, + "vmqWeight": 100 + }, + "isHostVirtualNetworkInterface": false, + "configurationState": { + "status": "Failure", + "detailedInfo": [ + { + "source": "VirtualSwitch", + "message": "The Port is blocked on the host.", + "code": "PortBlocked" + } + ], + "lastUpdatedTime": "2016-06-10T17:03:38.1131088-07:00", + "id": "2c784cfe-47f4-499c-ab27-905cfad0fb22" + }, + "isMultitenantStack": false + } + }, + { + "resourceRef": "/networkInterfaces/00000000-3333-0000-0000-000000000002", + "resourceId": "00000000-3333-0000-0000-000000000002", + "etag": "W/\"b69c7e1e-a13e-45e5-a5f5-3b7b7da4427a\"", + "instanceId": "568a9d72-3790-4b99-a8cb-245caeeeeffb", + "properties": { + "provisioningState": "Succeeded", + "dnsSettings": {}, + "privateMacAddress": "00FFFF0045FB", + "privateMacAllocationMethod": "Static", + "serviceInsertionElements": [], + "portSettings": { + "macSpoofingEnabled": "Disabled", + "arpGuardEnabled": "Disabled", + "dhcpGuardEnabled": "Disabled", + "stormLimit": 0, + "portFlowLimit": 0, + "iovWeight": 0, + "iovInterruptModeration": "Off", + "iovQueuePairsRequested": 0, + "vmqWeight": 100 + }, + "isHostVirtualNetworkInterface": false, + "configurationState": { + "status": "Failure", + "detailedInfo": [ + { + "source": "VirtualSwitch", + "message": "The Port is blocked on the host.", + "code": "PortBlocked" + } + ], + "lastUpdatedTime": "2016-06-10T17:03:38.1286886-07:00", + "id": "568a9d72-3790-4b99-a8cb-245caeeeeffb" + }, + "isMultitenantStack": false + } + }, + { + "resourceRef": "/networkInterfaces/12fc43be-402b-4251-9298-f983fc3f5342", + "resourceId": "12fc43be-402b-4251-9298-f983fc3f5342", + "etag": "W/\"bc08a698-966b-40e0-924a-47ca7f674a77\"", + "instanceId": "f54b24e6-4ff8-46f0-88e8-3043087d871a", + "properties": { + "provisioningState": "Succeeded", + "ipConfigurations": [ + { + "resourceRef": "/networkInterfaces/12fc43be-402b-4251-9298-f983fc3f5342/ipConfigurations/5941da25-a39b-43dc-afbe-014b3b105c16", + "resourceId": "5941da25-a39b-43dc-afbe-014b3b105c16", + "etag": "W/\"bc08a698-966b-40e0-924a-47ca7f674a77\"", + "instanceId": "2f9e0add-e89a-4a51-8696-7b5c0ed1a1e3", + "properties": { + "provisioningState": "Succeeded", + "privateIPAddress": "10.11.20.28", + "privateIPAllocationMethod": "Static", + "subnet": { + "resourceRef": "/logicalnetworks/47931036-2874-4d45-b1f1-b69666088968/subnets/d977fe45-c5d0-43b6-8420-acc441cd15ec" + }, + "accessControlList": { + "resourceRef": "/accessControlLists/R2H06D4-ACS03" + }, + "loadBalancerBackendAddressPools": [ + { + "resourceRef": "/loadBalancers/539bd9de-9506-4423-9047-6eb9364c2a84/backendAddressPools/b6fbd9dd-1611-4ab0-ab3a-37176707bb9b" + } + ], + "loadBalancerInboundNatRules": [] + } + } + ], + "dnsSettings": {}, + "privateMacAddress": "00FFFF003561", + "privateMacAllocationMethod": "Static", + "serviceInsertionElements": [], + "portSettings": { + "macSpoofingEnabled": "Disabled", + "arpGuardEnabled": "Disabled", + "dhcpGuardEnabled": "Disabled", + "stormLimit": 0, + "portFlowLimit": 0, + "iovWeight": 0, + "iovInterruptModeration": "Off", + "iovQueuePairsRequested": 0, + "vmqWeight": 100 + }, + "isHostVirtualNetworkInterface": false, + "configurationState": { + "status": "Failure", + "detailedInfo": [ + { + "source": "VirtualSwitch", + "message": "Failed to configure the policies on the Virtual Filtering Platform.", + "code": "PolicyConfigurationFailureOnVfp" + } + ], + "lastUpdatedTime": "2016-06-10T17:03:37.7948284-07:00", + "id": "f54b24e6-4ff8-46f0-88e8-3043087d871a" + }, + "isMultitenantStack": false + } + }, + { + "resourceRef": "/networkInterfaces/2bebbd8f-e18b-4990-ba88-ed7c9b1892f5", + "resourceId": "2bebbd8f-e18b-4990-ba88-ed7c9b1892f5", + "etag": "W/\"e018a8ef-a59c-4dff-9aae-f3f5c8cd24a9\"", + "instanceId": "38f40abe-9e46-4a00-beb1-3688652d3a4a", + "properties": { + "provisioningState": "Succeeded", + "ipConfigurations": [ + { + "resourceRef": "/networkInterfaces/2bebbd8f-e18b-4990-ba88-ed7c9b1892f5/ipConfigurations/f0131475-1920-40c6-a951-789557254a54", + "resourceId": "f0131475-1920-40c6-a951-789557254a54", + "etag": "W/\"e018a8ef-a59c-4dff-9aae-f3f5c8cd24a9\"", + "instanceId": "11f615e6-5527-4659-8c2c-6dc7104011d1", + "properties": { + "provisioningState": "Succeeded", + "privateIPAddress": "10.11.20.25", + "privateIPAllocationMethod": "Static", + "subnet": { + "resourceRef": "/logicalnetworks/47931036-2874-4d45-b1f1-b69666088968/subnets/d977fe45-c5d0-43b6-8420-acc441cd15ec" + }, + "accessControlList": { + "resourceRef": "/accessControlLists/R2H06D4-WAS01" + }, + "loadBalancerBackendAddressPools": [ + { + "resourceRef": "/loadBalancers/6e0d8b8d-6b9e-4704-b3a1-098f41ea0468/backendAddressPools/bf7d6edf-540f-4e3f-8984-06a86e89204a" + }, + { + "resourceRef": "/loadBalancers/67e54e56-e5e8-4a53-9a4b-cc932704b878/backendAddressPools/457cba88-2301-44cc-bc4a-9de74823ec2d" + }, + { + "resourceRef": "/loadBalancers/d1a62bf4-b448-40bb-9ebd-e14507c1a935/backendAddressPools/070493a5-3929-4292-80b5-0fdff61f8d39" + } + ], + "loadBalancerInboundNatRules": [] + } + } + ], + "dnsSettings": {}, + "privateMacAddress": "00FFFF0033D3", + "privateMacAllocationMethod": "Static", + "serviceInsertionElements": [], + "portSettings": { + "macSpoofingEnabled": "Disabled", + "arpGuardEnabled": "Disabled", + "dhcpGuardEnabled": "Disabled", + "stormLimit": 0, + "portFlowLimit": 0, + "iovWeight": 0, + "iovInterruptModeration": "Off", + "iovQueuePairsRequested": 0, + "vmqWeight": 100 + }, + "isHostVirtualNetworkInterface": false, + "configurationState": { + "status": "Failure", + "detailedInfo": [ + { + "source": "VirtualSwitch", + "message": "Failed to configure the policies on the Virtual Filtering Platform.", + "code": "PolicyConfigurationFailureOnVfp" + } + ], + "lastUpdatedTime": "2016-06-10T17:03:37.9099622-07:00", + "id": "38f40abe-9e46-4a00-beb1-3688652d3a4a" + }, + "isMultitenantStack": false + } + }, + { + "resourceRef": "/networkInterfaces/5508df81-a766-48d9-a42d-7a9ae1f6492d", + "resourceId": "5508df81-a766-48d9-a42d-7a9ae1f6492d", + "etag": "W/\"cda45dd0-9d32-44cf-af5f-deb74a246c62\"", + "instanceId": "8372e129-0b4f-43f1-96f7-4bd49b3e6192", + "properties": { + "provisioningState": "Succeeded", + "ipConfigurations": [ + { + "resourceRef": "/networkInterfaces/5508df81-a766-48d9-a42d-7a9ae1f6492d/ipConfigurations/e5ae036b-1b35-4529-9291-79522a5563e8", + "resourceId": "e5ae036b-1b35-4529-9291-79522a5563e8", + "etag": "W/\"cda45dd0-9d32-44cf-af5f-deb74a246c62\"", + "instanceId": "4e301a29-a3aa-425e-a3b3-e0be0a3d333c", + "properties": { + "provisioningState": "Succeeded", + "privateIPAddress": "10.11.20.29", + "privateIPAllocationMethod": "Static", + "subnet": { + "resourceRef": "/logicalnetworks/47931036-2874-4d45-b1f1-b69666088968/subnets/d977fe45-c5d0-43b6-8420-acc441cd15ec" + }, + "accessControlList": { + "resourceRef": "/accessControlLists/R2H06D4-Xrp01" + }, + "loadBalancerBackendAddressPools": [ + { + "resourceRef": "/loadBalancers/7c13fef9-2dcd-4561-8b33-087425c0b519/backendAddressPools/2fd20693-a837-430c-b695-8a1c9323d158" + }, + { + "resourceRef": "/loadBalancers/888db9d4-716c-4002-8bee-fc1b933a1457/backendAddressPools/4374e94e-4aef-4f24-bdfa-bf6b51498da5" + }, + { + "resourceRef": "/loadBalancers/99bdd85b-f979-4d3f-931e-48a80a88a885/backendAddressPools/9bfcf3b2-1c25-4360-88d8-0158cd0859bd" + }, + { + "resourceRef": "/loadBalancers/c5d4d9c6-5cdd-401f-a08c-3ac01315036a/backendAddressPools/39eed82a-28b1-4288-be68-631262788785" + } + ], + "loadBalancerInboundNatRules": [] + } + } + ], + "dnsSettings": {}, + "privateMacAddress": "00FFFF008AE5", + "privateMacAllocationMethod": "Static", + "serviceInsertionElements": [], + "portSettings": { + "macSpoofingEnabled": "Disabled", + "arpGuardEnabled": "Disabled", + "dhcpGuardEnabled": "Disabled", + "stormLimit": 0, + "portFlowLimit": 0, + "iovWeight": 0, + "iovInterruptModeration": "Off", + "iovQueuePairsRequested": 0, + "vmqWeight": 100 + }, + "isHostVirtualNetworkInterface": false, + "configurationState": { + "status": "Failure", + "detailedInfo": [ + { + "source": "VirtualSwitch", + "message": "Failed to configure the policies on the Virtual Filtering Platform.", + "code": "PolicyConfigurationFailureOnVfp" + } + ], + "lastUpdatedTime": "2016-06-10T17:03:38.0193353-07:00", + "id": "8372e129-0b4f-43f1-96f7-4bd49b3e6192" + }, + "isMultitenantStack": false + } + }, + { + "resourceRef": "/networkInterfaces/5ecfd6cf-0792-45c4-8fce-63a201e3f5d9", + "resourceId": "5ecfd6cf-0792-45c4-8fce-63a201e3f5d9", + "etag": "W/\"2b58427a-8613-4a16-baa4-3fc7450f4a42\"", + "instanceId": "c8d172b2-f756-4a25-8bcc-1d54d7d64955", + "properties": { + "provisioningState": "Succeeded", + "ipConfigurations": [ + { + "resourceRef": "/networkInterfaces/5ecfd6cf-0792-45c4-8fce-63a201e3f5d9/ipConfigurations/33b79dbc-8632-439d-bd27-2b85d515f8f4", + "resourceId": "33b79dbc-8632-439d-bd27-2b85d515f8f4", + "etag": "W/\"2b58427a-8613-4a16-baa4-3fc7450f4a42\"", + "instanceId": "317ce731-a7cb-4ef9-89fa-5e0f63574be9", + "properties": { + "provisioningState": "Succeeded", + "privateIPAddress": "10.11.20.22", + "privateIPAllocationMethod": "Static", + "subnet": { + "resourceRef": "/logicalnetworks/47931036-2874-4d45-b1f1-b69666088968/subnets/d977fe45-c5d0-43b6-8420-acc441cd15ec" + }, + "accessControlList": { + "resourceRef": "/accessControlLists/R2H06D4-ASql02" + }, + "loadBalancerBackendAddressPools": [], + "loadBalancerInboundNatRules": [] + } + } + ], + "dnsSettings": {}, + "privateMacAddress": "00FFFF003346", + "privateMacAllocationMethod": "Static", + "serviceInsertionElements": [], + "portSettings": { + "macSpoofingEnabled": "Disabled", + "arpGuardEnabled": "Disabled", + "dhcpGuardEnabled": "Disabled", + "stormLimit": 0, + "portFlowLimit": 0, + "iovWeight": 0, + "iovInterruptModeration": "Off", + "iovQueuePairsRequested": 0, + "vmqWeight": 100 + }, + "isHostVirtualNetworkInterface": false, + "configurationState": { + "status": "Failure", + "detailedInfo": [ + { + "source": "VirtualSwitch", + "message": "Failed to configure the policies on the Virtual Filtering Platform.", + "code": "PolicyConfigurationFailureOnVfp" + } + ], + "lastUpdatedTime": "2016-06-10T17:03:37.847415-07:00", + "id": "c8d172b2-f756-4a25-8bcc-1d54d7d64955" + }, + "isMultitenantStack": false + } + }, + { + "resourceRef": "/networkInterfaces/64814d86-8a2e-4a66-b452-f67b5e148a6f", + "resourceId": "64814d86-8a2e-4a66-b452-f67b5e148a6f", + "etag": "W/\"75a9396f-4fc9-47de-8404-eb33e38e0201\"", + "instanceId": "35bac936-f071-4644-a6e9-1543054b0e50", + "properties": { + "provisioningState": "Succeeded", + "ipConfigurations": [ + { + "resourceRef": "/networkInterfaces/64814d86-8a2e-4a66-b452-f67b5e148a6f/ipConfigurations/6d118103-b6b8-4621-8d67-93101a4770a5", + "resourceId": "6d118103-b6b8-4621-8d67-93101a4770a5", + "etag": "W/\"75a9396f-4fc9-47de-8404-eb33e38e0201\"", + "instanceId": "c0bec304-d698-4278-8bcb-521bde580ec5", + "properties": { + "provisioningState": "Succeeded", + "privateIPAddress": "10.11.20.31", + "privateIPAllocationMethod": "Static", + "subnet": { + "resourceRef": "/logicalnetworks/47931036-2874-4d45-b1f1-b69666088968/subnets/d977fe45-c5d0-43b6-8420-acc441cd15ec" + }, + "accessControlList": { + "resourceRef": "/accessControlLists/R2H06D4-CA01" + }, + "loadBalancerBackendAddressPools": [], + "loadBalancerInboundNatRules": [] + } + } + ], + "dnsSettings": {}, + "privateMacAddress": "00FFFF0036EE", + "privateMacAllocationMethod": "Static", + "serviceInsertionElements": [], + "portSettings": { + "macSpoofingEnabled": "Disabled", + "arpGuardEnabled": "Disabled", + "dhcpGuardEnabled": "Disabled", + "stormLimit": 0, + "portFlowLimit": 0, + "iovWeight": 0, + "iovInterruptModeration": "Off", + "iovQueuePairsRequested": 0, + "vmqWeight": 100 + }, + "isHostVirtualNetworkInterface": false, + "configurationState": { + "status": "Failure", + "detailedInfo": [ + { + "source": "VirtualSwitch", + "message": "Failed to configure the policies on the Virtual Filtering Platform.", + "code": "PolicyConfigurationFailureOnVfp" + } + ], + "lastUpdatedTime": "2016-06-10T17:03:38.0974609-07:00", + "id": "35bac936-f071-4644-a6e9-1543054b0e50" + }, + "isMultitenantStack": false + } + }, + { + "resourceRef": "/networkInterfaces/665d0a8b-00bd-4db8-9a9d-d7a234e58dcd", + "resourceId": "665d0a8b-00bd-4db8-9a9d-d7a234e58dcd", + "etag": "W/\"df409b55-8ba2-4540-b274-69f90c09427f\"", + "instanceId": "08062f05-7d88-4e0b-9ee9-5fd36e367a02", + "properties": { + "provisioningState": "Succeeded", + "ipConfigurations": [ + { + "resourceRef": "/networkInterfaces/665d0a8b-00bd-4db8-9a9d-d7a234e58dcd/ipConfigurations/834c1c0a-3880-41b2-a034-58a9143d8853", + "resourceId": "834c1c0a-3880-41b2-a034-58a9143d8853", + "etag": "W/\"df409b55-8ba2-4540-b274-69f90c09427f\"", + "instanceId": "bee20f5a-23ea-491a-9da6-041bfd927344", + "properties": { + "provisioningState": "Succeeded", + "privateIPAddress": "10.11.20.30", + "privateIPAllocationMethod": "Static", + "subnet": { + "resourceRef": "/logicalnetworks/47931036-2874-4d45-b1f1-b69666088968/subnets/d977fe45-c5d0-43b6-8420-acc441cd15ec" + }, + "accessControlList": { + "resourceRef": "/accessControlLists/R2H06D4-ADFS01" + }, + "loadBalancerBackendAddressPools": [ + { + "resourceRef": "/loadBalancers/92b66fb0-c8e4-4f2d-9548-aab8e70dd59a/backendAddressPools/15a0482e-0b94-4102-adf5-f6efb0c04237" + }, + { + "resourceRef": "/loadBalancers/c7672d18-8497-4359-85bf-e4e0982bf718/backendAddressPools/8b562e63-5b5a-4598-8953-52fd4c2e2f6e" + } + ], + "loadBalancerInboundNatRules": [] + } + } + ], + "dnsSettings": {}, + "privateMacAddress": "00FFFF00DF6A", + "privateMacAllocationMethod": "Static", + "serviceInsertionElements": [], + "portSettings": { + "macSpoofingEnabled": "Disabled", + "arpGuardEnabled": "Disabled", + "dhcpGuardEnabled": "Disabled", + "stormLimit": 0, + "portFlowLimit": 0, + "iovWeight": 0, + "iovInterruptModeration": "Off", + "iovQueuePairsRequested": 0, + "vmqWeight": 100 + }, + "isHostVirtualNetworkInterface": false, + "configurationState": { + "status": "Failure", + "detailedInfo": [ + { + "source": "VirtualSwitch", + "message": "Failed to configure the policies on the Virtual Filtering Platform.", + "code": "PolicyConfigurationFailureOnVfp" + } + ], + "lastUpdatedTime": "2016-06-10T17:03:38.066241-07:00", + "id": "08062f05-7d88-4e0b-9ee9-5fd36e367a02" + }, + "isMultitenantStack": false + } + }, + { + "resourceRef": "/networkInterfaces/6bfd26f7-c43e-4d25-9d9f-a995faf37e16", + "resourceId": "6bfd26f7-c43e-4d25-9d9f-a995faf37e16", + "etag": "W/\"a6c0a639-3182-4c64-bd8f-f21149f471f0\"", + "instanceId": "ff62cf92-b5bb-4bf2-9259-0704e41a9243", + "properties": { + "provisioningState": "Succeeded", + "ipConfigurations": [ + { + "resourceRef": "/networkInterfaces/6bfd26f7-c43e-4d25-9d9f-a995faf37e16/ipConfigurations/c4bbe7ab-e201-4fdd-9e97-fb6e11072829", + "resourceId": "c4bbe7ab-e201-4fdd-9e97-fb6e11072829", + "etag": "W/\"a6c0a639-3182-4c64-bd8f-f21149f471f0\"", + "instanceId": "17735903-d811-4c5e-837e-74363be61be9", + "properties": { + "provisioningState": "Succeeded", + "privateIPAddress": "10.11.20.20", + "privateIPAllocationMethod": "Static", + "subnet": { + "resourceRef": "/logicalnetworks/47931036-2874-4d45-b1f1-b69666088968/subnets/d977fe45-c5d0-43b6-8420-acc441cd15ec" + }, + "accessControlList": { + "resourceRef": "/accessControlLists/R2H06D4-Con01" + }, + "loadBalancerBackendAddressPools": [], + "loadBalancerInboundNatRules": [] + } + } + ], + "dnsSettings": {}, + "privateMacAddress": "00FFFF00873D", + "privateMacAllocationMethod": "Static", + "serviceInsertionElements": [], + "portSettings": { + "macSpoofingEnabled": "Disabled", + "arpGuardEnabled": "Disabled", + "dhcpGuardEnabled": "Disabled", + "stormLimit": 0, + "portFlowLimit": 0, + "iovWeight": 0, + "iovInterruptModeration": "Off", + "iovQueuePairsRequested": 0, + "vmqWeight": 100 + }, + "isHostVirtualNetworkInterface": false, + "configurationState": { + "status": "Failure", + "detailedInfo": [ + { + "source": "VirtualSwitch", + "message": "Failed to configure the policies on the Virtual Filtering Platform.", + "code": "PolicyConfigurationFailureOnVfp" + } + ], + "lastUpdatedTime": "2016-06-10T17:03:37.8104684-07:00", + "id": "ff62cf92-b5bb-4bf2-9259-0704e41a9243" + }, + "isMultitenantStack": false + } + }, + { + "resourceRef": "/networkInterfaces/c295951a-a495-41f0-b8ef-84d3317150a3", + "resourceId": "c295951a-a495-41f0-b8ef-84d3317150a3", + "etag": "W/\"592569bf-fdfa-4004-b465-5ec46fcdf27b\"", + "instanceId": "a362889f-e715-4f71-b798-d9530ec27306", + "properties": { + "provisioningState": "Succeeded", + "ipConfigurations": [ + { + "resourceRef": "/networkInterfaces/c295951a-a495-41f0-b8ef-84d3317150a3/ipConfigurations/e3d8fbc1-a0c2-4583-a3bc-96f59e1a31a3", + "resourceId": "e3d8fbc1-a0c2-4583-a3bc-96f59e1a31a3", + "etag": "W/\"592569bf-fdfa-4004-b465-5ec46fcdf27b\"", + "instanceId": "41b6f512-0224-4953-a7af-09757e1fe94d", + "properties": { + "provisioningState": "Succeeded", + "privateIPAddress": "10.11.20.24", + "privateIPAllocationMethod": "Static", + "subnet": { + "resourceRef": "/logicalnetworks/47931036-2874-4d45-b1f1-b69666088968/subnets/d977fe45-c5d0-43b6-8420-acc441cd15ec" + }, + "accessControlList": { + "resourceRef": "/accessControlLists/R2H06D4-WDS01" + }, + "loadBalancerBackendAddressPools": [], + "loadBalancerInboundNatRules": [] + } + } + ], + "dnsSettings": {}, + "privateMacAddress": "00FFFF00DD4F", + "privateMacAllocationMethod": "Static", + "serviceInsertionElements": [], + "portSettings": { + "macSpoofingEnabled": "Disabled", + "arpGuardEnabled": "Disabled", + "dhcpGuardEnabled": "Disabled", + "stormLimit": 0, + "portFlowLimit": 0, + "iovWeight": 0, + "iovInterruptModeration": "Off", + "iovQueuePairsRequested": 0, + "vmqWeight": 100 + }, + "isHostVirtualNetworkInterface": false, + "configurationState": { + "status": "Failure", + "detailedInfo": [ + { + "source": "VirtualSwitch", + "message": "Failed to configure the policies on the Virtual Filtering Platform.", + "code": "PolicyConfigurationFailureOnVfp" + } + ], + "lastUpdatedTime": "2016-06-10T17:03:37.8787124-07:00", + "id": "a362889f-e715-4f71-b798-d9530ec27306" + }, + "isMultitenantStack": false + } + }, + { + "resourceRef": "/networkInterfaces/cb30d461-1921-42b3-b8f1-042c02271aa1", + "resourceId": "cb30d461-1921-42b3-b8f1-042c02271aa1", + "etag": "W/\"c53edc8f-e195-4dd8-85e2-134c79e3a763\"", + "instanceId": "1dbd4c42-d37b-472c-a4dc-f3f983078515", + "properties": { + "provisioningState": "Succeeded", + "ipConfigurations": [ + { + "resourceRef": "/networkInterfaces/cb30d461-1921-42b3-b8f1-042c02271aa1/ipConfigurations/0d1e86b9-2442-43fc-8fdf-7d12f1f152ca", + "resourceId": "0d1e86b9-2442-43fc-8fdf-7d12f1f152ca", + "etag": "W/\"c53edc8f-e195-4dd8-85e2-134c79e3a763\"", + "instanceId": "09f3330e-2fec-41cc-a0f7-47598bbee61a", + "properties": { + "provisioningState": "Succeeded", + "privateIPAddress": "10.11.20.21", + "privateIPAllocationMethod": "Static", + "subnet": { + "resourceRef": "/logicalnetworks/47931036-2874-4d45-b1f1-b69666088968/subnets/d977fe45-c5d0-43b6-8420-acc441cd15ec" + }, + "accessControlList": { + "resourceRef": "/accessControlLists/R2H06D4-ASql01" + }, + "loadBalancerBackendAddressPools": [], + "loadBalancerInboundNatRules": [] + } + } + ], + "dnsSettings": {}, + "privateMacAddress": "00FFFF00DDC1", + "privateMacAllocationMethod": "Static", + "serviceInsertionElements": [], + "portSettings": { + "macSpoofingEnabled": "Disabled", + "arpGuardEnabled": "Disabled", + "dhcpGuardEnabled": "Disabled", + "stormLimit": 0, + "portFlowLimit": 0, + "iovWeight": 0, + "iovInterruptModeration": "Off", + "iovQueuePairsRequested": 0, + "vmqWeight": 100 + }, + "isHostVirtualNetworkInterface": false, + "configurationState": { + "status": "Failure", + "detailedInfo": [ + { + "source": "VirtualSwitch", + "message": "Failed to configure the policies on the Virtual Filtering Platform.", + "code": "PolicyConfigurationFailureOnVfp" + } + ], + "lastUpdatedTime": "2016-06-10T17:03:37.8359266-07:00", + "id": "1dbd4c42-d37b-472c-a4dc-f3f983078515" + }, + "isMultitenantStack": false + } + }, + { + "resourceRef": "/networkInterfaces/e40e3b34-13fd-42fc-a74e-26fe68999b73", + "resourceId": "e40e3b34-13fd-42fc-a74e-26fe68999b73", + "etag": "W/\"7481d801-d103-4c30-a6d2-013df0790946\"", + "instanceId": "cf89bc5d-32d6-4f35-9cbf-66ae94e5c004", + "properties": { + "provisioningState": "Succeeded", + "ipConfigurations": [ + { + "resourceRef": "/networkInterfaces/e40e3b34-13fd-42fc-a74e-26fe68999b73/ipConfigurations/424fb61c-3b12-4c02-82d3-4a36d66d1617", + "resourceId": "424fb61c-3b12-4c02-82d3-4a36d66d1617", + "etag": "W/\"7481d801-d103-4c30-a6d2-013df0790946\"", + "instanceId": "b53ecbbf-b21c-43f1-a606-36b9fe111e80", + "properties": { + "provisioningState": "Succeeded", + "privateIPAddress": "10.11.20.26", + "privateIPAllocationMethod": "Static", + "subnet": { + "resourceRef": "/logicalnetworks/47931036-2874-4d45-b1f1-b69666088968/subnets/d977fe45-c5d0-43b6-8420-acc441cd15ec" + }, + "accessControlList": { + "resourceRef": "/accessControlLists/R2H06D4-ACS01" + }, + "loadBalancerBackendAddressPools": [ + { + "resourceRef": "/loadBalancers/539bd9de-9506-4423-9047-6eb9364c2a84/backendAddressPools/b6fbd9dd-1611-4ab0-ab3a-37176707bb9b" + } + ], + "loadBalancerInboundNatRules": [] + } + } + ], + "dnsSettings": {}, + "privateMacAddress": "00FFFF008A58", + "privateMacAllocationMethod": "Static", + "serviceInsertionElements": [], + "portSettings": { + "macSpoofingEnabled": "Disabled", + "arpGuardEnabled": "Disabled", + "dhcpGuardEnabled": "Disabled", + "stormLimit": 0, + "portFlowLimit": 0, + "iovWeight": 0, + "iovInterruptModeration": "Off", + "iovQueuePairsRequested": 0, + "vmqWeight": 100 + }, + "isHostVirtualNetworkInterface": false, + "configurationState": { + "status": "Failure", + "detailedInfo": [ + { + "source": "VirtualSwitch", + "message": "Failed to configure the policies on the Virtual Filtering Platform.", + "code": "PolicyConfigurationFailureOnVfp" + } + ], + "lastUpdatedTime": "2016-06-10T17:03:37.9412444-07:00", + "id": "cf89bc5d-32d6-4f35-9cbf-66ae94e5c004" + }, + "isMultitenantStack": false + } + }, + { + "resourceRef": "/networkInterfaces/e9e900f3-8285-4fef-b336-65b4896e09a8", + "resourceId": "e9e900f3-8285-4fef-b336-65b4896e09a8", + "etag": "W/\"e248b728-51a2-4be7-91cf-8d894a33dbaf\"", + "instanceId": "dbd62461-2f1b-434a-aa54-d7fab820cd57", + "properties": { + "provisioningState": "Succeeded", + "ipConfigurations": [ + { + "resourceRef": "/networkInterfaces/e9e900f3-8285-4fef-b336-65b4896e09a8/ipConfigurations/007efd64-1e3e-4104-97c7-039cc1bd3ec3", + "resourceId": "007efd64-1e3e-4104-97c7-039cc1bd3ec3", + "etag": "W/\"e248b728-51a2-4be7-91cf-8d894a33dbaf\"", + "instanceId": "7f9593e7-c92b-4e63-b1d8-c0bfa3119e2e", + "properties": { + "provisioningState": "Succeeded", + "privateIPAddress": "10.11.20.23", + "privateIPAllocationMethod": "Static", + "subnet": { + "resourceRef": "/logicalnetworks/47931036-2874-4d45-b1f1-b69666088968/subnets/d977fe45-c5d0-43b6-8420-acc441cd15ec" + }, + "accessControlList": { + "resourceRef": "/accessControlLists/R2H06D4-SUS01" + }, + "loadBalancerBackendAddressPools": [], + "loadBalancerInboundNatRules": [] + } + } + ], + "dnsSettings": {}, + "privateMacAddress": "00FFFF0089CA", + "privateMacAllocationMethod": "Static", + "serviceInsertionElements": [], + "portSettings": { + "macSpoofingEnabled": "Disabled", + "arpGuardEnabled": "Disabled", + "dhcpGuardEnabled": "Disabled", + "stormLimit": 0, + "portFlowLimit": 0, + "iovWeight": 0, + "iovInterruptModeration": "Off", + "iovQueuePairsRequested": 0, + "vmqWeight": 100 + }, + "isHostVirtualNetworkInterface": false, + "configurationState": { + "status": "Failure", + "detailedInfo": [ + { + "source": "VirtualSwitch", + "message": "Failed to configure the policies on the Virtual Filtering Platform.", + "code": "PolicyConfigurationFailureOnVfp" + } + ], + "lastUpdatedTime": "2016-06-10T17:03:37.8630807-07:00", + "id": "dbd62461-2f1b-434a-aa54-d7fab820cd57" + }, + "isMultitenantStack": false + } + }, + { + "resourceRef": "/networkInterfaces/f5730847-0879-4eab-89de-ce54b217630c", + "resourceId": "f5730847-0879-4eab-89de-ce54b217630c", + "etag": "W/\"0d7aa01f-dd17-48ad-ba7b-cf20de59563b\"", + "instanceId": "d0842ac6-36aa-4fae-93ce-98beedaca3ee", + "properties": { + "provisioningState": "Succeeded", + "ipConfigurations": [ + { + "resourceRef": "/networkInterfaces/f5730847-0879-4eab-89de-ce54b217630c/ipConfigurations/cf2a6356-c9de-4e63-9abe-d4b7759a7181", + "resourceId": "cf2a6356-c9de-4e63-9abe-d4b7759a7181", + "etag": "W/\"0d7aa01f-dd17-48ad-ba7b-cf20de59563b\"", + "instanceId": "efce1627-227b-44a7-8bee-83cb578472a8", + "properties": { + "provisioningState": "Succeeded", + "privateIPAddress": "10.11.20.27", + "privateIPAllocationMethod": "Static", + "subnet": { + "resourceRef": "/logicalnetworks/47931036-2874-4d45-b1f1-b69666088968/subnets/d977fe45-c5d0-43b6-8420-acc441cd15ec" + }, + "accessControlList": { + "resourceRef": "/accessControlLists/R2H06D4-ACS02" + }, + "loadBalancerBackendAddressPools": [ + { + "resourceRef": "/loadBalancers/539bd9de-9506-4423-9047-6eb9364c2a84/backendAddressPools/b6fbd9dd-1611-4ab0-ab3a-37176707bb9b" + } + ], + "loadBalancerInboundNatRules": [] + } + } + ], + "dnsSettings": {}, + "privateMacAddress": "00FFFF00DFDC", + "privateMacAllocationMethod": "Static", + "serviceInsertionElements": [], + "portSettings": { + "macSpoofingEnabled": "Disabled", + "arpGuardEnabled": "Disabled", + "dhcpGuardEnabled": "Disabled", + "stormLimit": 0, + "portFlowLimit": 0, + "iovWeight": 0, + "iovInterruptModeration": "Off", + "iovQueuePairsRequested": 0, + "vmqWeight": 100 + }, + "isHostVirtualNetworkInterface": false, + "configurationState": { + "status": "Failure", + "detailedInfo": [ + { + "source": "VirtualSwitch", + "message": "Failed to configure the policies on the Virtual Filtering Platform.", + "code": "PolicyConfigurationFailureOnVfp" + } + ], + "lastUpdatedTime": "2016-06-10T17:03:37.972492-07:00", + "id": "d0842ac6-36aa-4fae-93ce-98beedaca3ee" + }, + "isMultitenantStack": false + } + } + ], + "nextLink": "" +} \ No newline at end of file diff --git a/hnv_client/tests/test_client.py b/hnv_client/tests/test_client.py index 4e39978..14d4964 100644 --- a/hnv_client/tests/test_client.py +++ b/hnv_client/tests/test_client.py @@ -174,7 +174,7 @@ class TestClient(unittest.TestCase): self._response = fake_response.FakeResponse() def _test_get_resource(self, model, raw_data): - with test_utils.LogSnatcher("hnv_client.client") as logging: + with test_utils.LogSnatcher("hnv_client.common.model") as logging: model.from_raw_data(raw_data) self.assertEqual(logging.output, []) @@ -215,3 +215,27 @@ class TestClient(unittest.TestCase): raw_data["grandParentResourceID"] = "{uniqueString}" self._test_get_resource(model=client.IPPools, raw_data=raw_data) + + def test_network_interfaces(self): + resources = self._response.network_interfaces() + for raw_data in resources.get("value", []): + self._test_get_resource(model=client.NetworkInterfaces, + raw_data=raw_data) + + def test_network_interfaces_structure(self): + raw_data = self._response.network_interfaces()["value"][0] + network_interface = client.NetworkInterfaces.from_raw_data(raw_data) + + for configuration in network_interface.ip_configurations: + self.assertIsInstance(configuration, client.IPConfiguration) + + self.assertIsInstance(network_interface.dns_settings, + client.DNSSettings) + self.assertIsInstance(network_interface.port_settings, + client.PortSettings) + + def test_ip_configurations(self): + resources = self._response.ip_configurations() + for raw_data in resources.get("value", []): + self._test_get_resource(model=client.IPConfiguration, + raw_data=raw_data)