github.com/ablease/cli@v6.37.1-0.20180613014814-3adbb7d7fb19+incompatible/actor/cfnetworkingaction/policy.go (about)

     1  package cfnetworkingaction
     2  
     3  import (
     4  	"code.cloudfoundry.org/cfnetworking-cli-api/cfnetworking/cfnetv1"
     5  	"code.cloudfoundry.org/cli/actor/actionerror"
     6  )
     7  
     8  type Policy struct {
     9  	SourceName      string
    10  	DestinationName string
    11  	Protocol        string
    12  	StartPort       int
    13  	EndPort         int
    14  }
    15  
    16  func (actor Actor) AddNetworkPolicy(spaceGUID, srcAppName, destAppName, protocol string, startPort, endPort int) (Warnings, error) {
    17  	var allWarnings Warnings
    18  
    19  	srcApp, warnings, err := actor.V3Actor.GetApplicationByNameAndSpace(srcAppName, spaceGUID)
    20  	allWarnings = append(allWarnings, Warnings(warnings)...)
    21  	if err != nil {
    22  		return allWarnings, err
    23  	}
    24  
    25  	destApp, warnings, err := actor.V3Actor.GetApplicationByNameAndSpace(destAppName, spaceGUID)
    26  	allWarnings = append(allWarnings, Warnings(warnings)...)
    27  	if err != nil {
    28  		return allWarnings, err
    29  	}
    30  
    31  	err = actor.NetworkingClient.CreatePolicies([]cfnetv1.Policy{
    32  		{
    33  			Source: cfnetv1.PolicySource{
    34  				ID: srcApp.GUID,
    35  			},
    36  			Destination: cfnetv1.PolicyDestination{
    37  				ID:       destApp.GUID,
    38  				Protocol: cfnetv1.PolicyProtocol(protocol),
    39  				Ports: cfnetv1.Ports{
    40  					Start: startPort,
    41  					End:   endPort,
    42  				},
    43  			},
    44  		},
    45  	})
    46  	return allWarnings, err
    47  }
    48  
    49  func (actor Actor) NetworkPoliciesBySpace(spaceGUID string) ([]Policy, Warnings, error) {
    50  	var allWarnings Warnings
    51  
    52  	applications, warnings, err := actor.V3Actor.GetApplicationsBySpace(spaceGUID)
    53  	allWarnings = append(allWarnings, Warnings(warnings)...)
    54  	if err != nil {
    55  		return []Policy{}, allWarnings, err
    56  	}
    57  
    58  	var v1Policies []cfnetv1.Policy
    59  	v1Policies, err = actor.NetworkingClient.ListPolicies()
    60  	if err != nil {
    61  		return []Policy{}, allWarnings, err
    62  	}
    63  
    64  	appNameByGuid := map[string]string{}
    65  	for _, app := range applications {
    66  		appNameByGuid[app.GUID] = app.Name
    67  	}
    68  
    69  	var policies []Policy
    70  	emptyPolicy := Policy{}
    71  	for _, v1Policy := range v1Policies {
    72  		policy := actor.transformPolicy(appNameByGuid, v1Policy)
    73  		if policy != emptyPolicy {
    74  			policies = append(policies, policy)
    75  		}
    76  	}
    77  
    78  	return policies, allWarnings, nil
    79  }
    80  
    81  func (actor Actor) NetworkPoliciesBySpaceAndAppName(spaceGUID string, srcAppName string) ([]Policy, Warnings, error) {
    82  	var allWarnings Warnings
    83  	var appGUID string
    84  
    85  	applications, warnings, err := actor.V3Actor.GetApplicationsBySpace(spaceGUID)
    86  	allWarnings = append(allWarnings, Warnings(warnings)...)
    87  	if err != nil {
    88  		return []Policy{}, allWarnings, err
    89  	}
    90  
    91  	appNameByGuid := map[string]string{}
    92  	for _, app := range applications {
    93  		appNameByGuid[app.GUID] = app.Name
    94  	}
    95  
    96  	var v1Policies []cfnetv1.Policy
    97  
    98  	srcApp, warnings, err := actor.V3Actor.GetApplicationByNameAndSpace(srcAppName, spaceGUID)
    99  	allWarnings = append(allWarnings, Warnings(warnings)...)
   100  	if err != nil {
   101  		return []Policy{}, allWarnings, err
   102  	}
   103  
   104  	appGUID = srcApp.GUID
   105  	v1Policies, err = actor.NetworkingClient.ListPolicies(appGUID)
   106  	if err != nil {
   107  		return []Policy{}, allWarnings, err
   108  	}
   109  
   110  	var policies []Policy
   111  	emptyPolicy := Policy{}
   112  	for _, v1Policy := range v1Policies {
   113  		if v1Policy.Source.ID == appGUID {
   114  			policy := actor.transformPolicy(appNameByGuid, v1Policy)
   115  			if policy != emptyPolicy {
   116  				policies = append(policies, policy)
   117  			}
   118  		}
   119  	}
   120  
   121  	return policies, allWarnings, nil
   122  }
   123  
   124  func (actor Actor) RemoveNetworkPolicy(spaceGUID, srcAppName, destAppName, protocol string, startPort, endPort int) (Warnings, error) {
   125  	var allWarnings Warnings
   126  
   127  	srcApp, warnings, err := actor.V3Actor.GetApplicationByNameAndSpace(srcAppName, spaceGUID)
   128  	allWarnings = append(allWarnings, Warnings(warnings)...)
   129  	if err != nil {
   130  		return allWarnings, err
   131  	}
   132  
   133  	destApp, warnings, err := actor.V3Actor.GetApplicationByNameAndSpace(destAppName, spaceGUID)
   134  	allWarnings = append(allWarnings, Warnings(warnings)...)
   135  	if err != nil {
   136  		return allWarnings, err
   137  	}
   138  
   139  	policyToRemove := cfnetv1.Policy{
   140  		Source: cfnetv1.PolicySource{
   141  			ID: srcApp.GUID,
   142  		},
   143  		Destination: cfnetv1.PolicyDestination{
   144  			ID:       destApp.GUID,
   145  			Protocol: cfnetv1.PolicyProtocol(protocol),
   146  			Ports: cfnetv1.Ports{
   147  				Start: startPort,
   148  				End:   endPort,
   149  			},
   150  		},
   151  	}
   152  
   153  	v1Policies, err := actor.NetworkingClient.ListPolicies(srcApp.GUID)
   154  	if err != nil {
   155  		return allWarnings, err
   156  	}
   157  
   158  	for _, v1Policy := range v1Policies {
   159  		if v1Policy == policyToRemove {
   160  			return allWarnings, actor.NetworkingClient.RemovePolicies([]cfnetv1.Policy{policyToRemove})
   161  		}
   162  	}
   163  
   164  	return allWarnings, actionerror.PolicyDoesNotExistError{}
   165  }
   166  
   167  func (Actor) transformPolicy(appNameByGuid map[string]string, v1Policy cfnetv1.Policy) Policy {
   168  	srcName, srcOk := appNameByGuid[v1Policy.Source.ID]
   169  	dstName, dstOk := appNameByGuid[v1Policy.Destination.ID]
   170  	if srcOk && dstOk {
   171  		return Policy{
   172  			SourceName:      srcName,
   173  			DestinationName: dstName,
   174  			Protocol:        string(v1Policy.Destination.Protocol),
   175  			StartPort:       v1Policy.Destination.Ports.Start,
   176  			EndPort:         v1Policy.Destination.Ports.End,
   177  		}
   178  	}
   179  	return Policy{}
   180  }