github.com/cloudfoundry-attic/cli-with-i18n@v6.32.1-0.20171002233121-7401370d3b85+incompatible/actor/cfnetworkingaction/policy.go (about)

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