Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions hcn/hcnendpoint_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import (
)

func TestCreateDeleteEndpoint(t *testing.T) {
network, err := HcnCreateTestNetwork()
network, err := HcnCreateTestNATNetwork()
if err != nil {
t.Fatal(err)
}
Expand All @@ -34,7 +34,7 @@ func TestCreateDeleteEndpoint(t *testing.T) {
}

func TestGetEndpointById(t *testing.T) {
network, err := HcnCreateTestNetwork()
network, err := HcnCreateTestNATNetwork()
if err != nil {
t.Fatal(err)
}
Expand Down Expand Up @@ -62,7 +62,7 @@ func TestGetEndpointById(t *testing.T) {
}

func TestGetEndpointByName(t *testing.T) {
network, err := HcnCreateTestNetwork()
network, err := HcnCreateTestNATNetwork()
if err != nil {
t.Fatal(err)
}
Expand Down Expand Up @@ -90,7 +90,7 @@ func TestGetEndpointByName(t *testing.T) {
}

func TestListEndpoints(t *testing.T) {
network, err := HcnCreateTestNetwork()
network, err := HcnCreateTestNATNetwork()
if err != nil {
t.Fatal(err)
}
Expand Down Expand Up @@ -118,7 +118,7 @@ func TestListEndpoints(t *testing.T) {
}

func TestListEndpointsOfNetwork(t *testing.T) {
network, err := HcnCreateTestNetwork()
network, err := HcnCreateTestNATNetwork()
if err != nil {
t.Fatal(err)
}
Expand Down Expand Up @@ -146,7 +146,7 @@ func TestListEndpointsOfNetwork(t *testing.T) {
}

func TestEndpointNamespaceAttachDetach(t *testing.T) {
network, err := HcnCreateTestNetwork()
network, err := HcnCreateTestNATNetwork()
if err != nil {
t.Fatal(err)
}
Expand Down Expand Up @@ -183,7 +183,7 @@ func TestEndpointNamespaceAttachDetach(t *testing.T) {
}

func TestCreateEndpointWithNamespace(t *testing.T) {
network, err := HcnCreateTestNetwork()
network, err := HcnCreateTestNATNetwork()
if err != nil {
t.Fatal(err)
}
Expand All @@ -210,7 +210,7 @@ func TestCreateEndpointWithNamespace(t *testing.T) {
}

func TestApplyPolicyOnEndpoint(t *testing.T) {
network, err := HcnCreateTestNetwork()
network, err := HcnCreateTestNATNetwork()
if err != nil {
t.Fatal(err)
}
Expand Down Expand Up @@ -251,7 +251,7 @@ func TestApplyPolicyOnEndpoint(t *testing.T) {
}

func TestModifyEndpointSettings(t *testing.T) {
network, err := HcnCreateTestNetwork()
network, err := HcnCreateTestNATNetwork()
if err != nil {
t.Fatal(err)
}
Expand Down
12 changes: 6 additions & 6 deletions hcn/hcnloadbalancer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import (
)

func TestCreateDeleteLoadBalancer(t *testing.T) {
network, err := HcnCreateTestNetwork()
network, err := HcnCreateTestNATNetwork()
if err != nil {
t.Fatal(err)
}
Expand Down Expand Up @@ -42,7 +42,7 @@ func TestCreateDeleteLoadBalancer(t *testing.T) {
}

func TestGetLoadBalancerById(t *testing.T) {
network, err := HcnCreateTestNetwork()
network, err := HcnCreateTestNATNetwork()
if err != nil {
t.Fatal(err)
}
Expand Down Expand Up @@ -83,7 +83,7 @@ func TestListLoadBalancer(t *testing.T) {
}

func TestLoadBalancerAddRemoveEndpoint(t *testing.T) {
network, err := HcnCreateTestNetwork()
network, err := HcnCreateTestNATNetwork()
if err != nil {
t.Fatal(err)
}
Expand Down Expand Up @@ -135,7 +135,7 @@ func TestLoadBalancerAddRemoveEndpoint(t *testing.T) {
}

func TestAddLoadBalancer(t *testing.T) {
network, err := HcnCreateTestNetwork()
network, err := HcnCreateTestNATNetwork()
if err != nil {
t.Fatal(err)
}
Expand Down Expand Up @@ -171,7 +171,7 @@ func TestAddLoadBalancer(t *testing.T) {
}

func TestAddDSRLoadBalancer(t *testing.T) {
network, err := HcnCreateTestNetwork()
network, err := CreateTestOverlayNetwork()
if err != nil {
t.Fatal(err)
}
Expand Down Expand Up @@ -207,7 +207,7 @@ func TestAddDSRLoadBalancer(t *testing.T) {
}

func TestAddILBLoadBalancer(t *testing.T) {
network, err := HcnCreateTestNetwork()
network, err := CreateTestOverlayNetwork()
if err != nil {
t.Fatal(err)
}
Expand Down
6 changes: 3 additions & 3 deletions hcn/hcnnamespace_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ func TestListNamespaces(t *testing.T) {
}

func TestGetNamespaceEndpointIds(t *testing.T) {
network, err := HcnCreateTestNetwork()
network, err := HcnCreateTestNATNetwork()
if err != nil {
t.Fatal(err)
}
Expand Down Expand Up @@ -161,7 +161,7 @@ func TestGetNamespaceContainers(t *testing.T) {
}

func TestAddRemoveNamespaceEndpoint(t *testing.T) {
network, err := HcnCreateTestNetwork()
network, err := HcnCreateTestNATNetwork()
if err != nil {
t.Fatal(err)
}
Expand Down Expand Up @@ -205,7 +205,7 @@ func TestAddRemoveNamespaceEndpoint(t *testing.T) {
}

func TestModifyNamespaceSettings(t *testing.T) {
network, err := HcnCreateTestNetwork()
network, err := HcnCreateTestNATNetwork()
if err != nil {
t.Fatal(err)
}
Expand Down
74 changes: 74 additions & 0 deletions hcn/hcnnetwork.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,30 @@ type HostComputeNetwork struct {
SchemaVersion SchemaVersion `json:",omitempty"`
}

// NetworkResourceType are the 3 different Network settings resources.
type NetworkResourceType string

var (
// NetworkResourceTypePolicy is for Network's policies. Ex: RemoteSubnet
NetworkResourceTypePolicy NetworkResourceType = "Policy"
// NetworkResourceTypeDNS is for Network's DNS settings.
NetworkResourceTypeDNS NetworkResourceType = "DNS"
// NetworkResourceTypeExtension is for Network's extension settings.
NetworkResourceTypeExtension NetworkResourceType = "Extension"
)

// ModifyNetworkSettingRequest is the structure used to send request to modify an network.
// Used to update DNS/extension/policy on an network.
type ModifyNetworkSettingRequest struct {
ResourceType NetworkResourceType `json:",omitempty"` // Policy, DNS, Extension
RequestType RequestType `json:",omitempty"` // Add, Remove, Update, Refresh
Settings json.RawMessage `json:",omitempty"`
Comment thread
pradipd marked this conversation as resolved.
}

type PolicyNetworkRequest struct {
Policies []NetworkPolicy `json:",omitempty"`
}

func getNetwork(networkGuid guid.GUID, query string) (*HostComputeNetwork, error) {
// Open network.
var (
Expand Down Expand Up @@ -311,6 +335,56 @@ func (network *HostComputeNetwork) Delete() (*HostComputeNetwork, error) {
return nil, nil
}

// ModifyNetworkSettings updates the Policy for a network.
func (network *HostComputeNetwork) ModifyNetworkSettings(request *ModifyNetworkSettingRequest) error {
Comment thread
pradipd marked this conversation as resolved.
logrus.Debugf("hcn::HostComputeNetwork::ModifyNetworkSettings id=%s", network.Id)

networkSettingsRequest, err := json.Marshal(request)
if err != nil {
return err
}

_, err = modifyNetwork(network.Id, string(networkSettingsRequest))
if err != nil {
return err
}
return nil
}

// AddPolicy applies a Policy (ex: RemoteSubnet) on the Network.
func (network *HostComputeNetwork) AddPolicy(networkPolicy PolicyNetworkRequest) error {
logrus.Debugf("hcn::HostComputeNetwork::AddPolicy id=%s", network.Id)

settingsJson, err := json.Marshal(networkPolicy)
if err != nil {
return err
}
requestMessage := &ModifyNetworkSettingRequest{
ResourceType: NetworkResourceTypePolicy,
RequestType: RequestTypeAdd,
Settings: settingsJson,
}

return network.ModifyNetworkSettings(requestMessage)
}

// RemovePolicy removes a Policy (ex: RemoteSubnet) from the Network.
func (network *HostComputeNetwork) RemovePolicy(networkPolicy PolicyNetworkRequest) error {
logrus.Debugf("hcn::HostComputeNetwork::RemovePolicy id=%s", network.Id)

settingsJson, err := json.Marshal(networkPolicy)
if err != nil {
return err
}
requestMessage := &ModifyNetworkSettingRequest{
ResourceType: NetworkResourceTypePolicy,
RequestType: RequestTypeRemove,
Settings: settingsJson,
}

return network.ModifyNetworkSettings(requestMessage)
}

// CreateEndpoint creates an endpoint on the Network.
func (network *HostComputeNetwork) CreateEndpoint(endpoint *HostComputeEndpoint) (*HostComputeEndpoint, error) {
isRemote := endpoint.Flags&EndpointFlagsRemoteEndpoint != 0
Expand Down
64 changes: 61 additions & 3 deletions hcn/hcnnetwork_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import (
)

func TestCreateDeleteNetwork(t *testing.T) {
network, err := HcnCreateTestNetwork()
network, err := HcnCreateTestNATNetwork()
if err != nil {
t.Fatal(err)
}
Expand All @@ -25,7 +25,7 @@ func TestCreateDeleteNetwork(t *testing.T) {
}

func TestGetNetworkByName(t *testing.T) {
network, err := HcnCreateTestNetwork()
network, err := HcnCreateTestNATNetwork()
if err != nil {
t.Fatal(err)
}
Expand All @@ -43,7 +43,7 @@ func TestGetNetworkByName(t *testing.T) {
}

func TestGetNetworkById(t *testing.T) {
network, err := HcnCreateTestNetwork()
network, err := HcnCreateTestNATNetwork()
if err != nil {
t.Fatal(err)
}
Expand All @@ -66,3 +66,61 @@ func TestListNetwork(t *testing.T) {
t.Fatal(err)
}
}

func TestAddRemoveRemoteSubnetRoutePolicy(t *testing.T) {

network, err := CreateTestOverlayNetwork()
if err != nil {
t.Fatal(err)
}

remoteSubnetRoutePolicy, err := HcnCreateTestRemoteSubnetRoute()
if err != nil {
t.Fatal(err)
}

//Add Policy
network.AddPolicy(*remoteSubnetRoutePolicy)

//Reload the network object from HNS.
network, err = GetNetworkByID(network.Id)
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not fond of this pattern. We shouldn't have to reload the network after modifying. After updating the network (or endpoint) the network should be automatically updated. However, this behavior is consistent with the Endpoint API's.
I'd prefer we change this behavior in a separate PR.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I like your proposal.

if err != nil {
t.Fatal(err)
}

foundPolicy := false
for _, policy := range network.Policies {
if policy.Type == RemoteSubnetRoute {
foundPolicy = true
break
}
}
if !foundPolicy {
t.Fatalf("Could not find remote subnet route policy on network.")
}

//Remove Policy.
network.RemovePolicy(*remoteSubnetRoutePolicy)

//Reload the network object from HNS.
network, err = GetNetworkByID(network.Id)
if err != nil {
t.Fatal(err)
}

foundPolicy = false
for _, policy := range network.Policies {
if policy.Type == RemoteSubnetRoute {
foundPolicy = true
break
}
}
if foundPolicy {
t.Fatalf("Found remote subnet route policy on network when it should have been deleted.")
}

_, err = network.Delete()
if err != nil {
t.Fatal(err)
}
}
9 changes: 9 additions & 0 deletions hcn/hcnpolicy.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ const (
AutomaticDNS NetworkPolicyType = "AutomaticDNS"
InterfaceConstraint NetworkPolicyType = "InterfaceConstraint"
ProviderAddress NetworkPolicyType = "ProviderAddress"
RemoteSubnetRoute NetworkPolicyType = "RemoteSubnetRoute"
)

// NetworkPolicy is a collection of Policy settings for a Network.
Expand Down Expand Up @@ -205,3 +206,11 @@ type VlanPolicySetting struct {
type VsidPolicySetting struct {
IsolationId uint32 `json:","`
}

// RemoteSubnetRoutePolicySetting creates remote subnet route rules on a network
type RemoteSubnetRoutePolicySetting struct {
DestinationPrefix string
IsolationId uint16
ProviderAddress string
DistributedRouterMacAddress string
}
Loading