github.com/franc20/ayesa_sap@v7.0.0-beta.28.0.20200124003224-302d4d52fa6c+incompatible/actor/v7action/space.go (about)

     1  package v7action
     2  
     3  import (
     4  	"fmt"
     5  	"sort"
     6  
     7  	"code.cloudfoundry.org/cli/actor/actionerror"
     8  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccerror"
     9  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv3"
    10  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant"
    11  )
    12  
    13  type Space ccv3.Space
    14  
    15  type SpaceSummary struct {
    16  	Space
    17  	Name                 string
    18  	OrgName              string
    19  	AppNames             []string
    20  	ServiceInstanceNames []string
    21  	IsolationSegmentName string
    22  }
    23  
    24  func (actor Actor) CreateSpace(spaceName, orgGUID string) (Space, Warnings, error) {
    25  	allWarnings := Warnings{}
    26  
    27  	space, apiWarnings, err := actor.CloudControllerClient.CreateSpace(ccv3.Space{
    28  		Name: spaceName,
    29  		Relationships: ccv3.Relationships{
    30  			constant.RelationshipTypeOrganization: ccv3.Relationship{GUID: orgGUID},
    31  		},
    32  	})
    33  
    34  	actorWarnings := Warnings(apiWarnings)
    35  	allWarnings = append(allWarnings, actorWarnings...)
    36  
    37  	if _, ok := err.(ccerror.NameNotUniqueInOrgError); ok {
    38  		return Space{}, allWarnings, actionerror.SpaceAlreadyExistsError{Space: spaceName}
    39  	}
    40  	return Space{
    41  		GUID: space.GUID,
    42  		Name: spaceName,
    43  	}, allWarnings, err
    44  }
    45  
    46  // ResetSpaceIsolationSegment disassociates a space from an isolation segment.
    47  //
    48  // If the space's organization has a default isolation segment, return its
    49  // name. Otherwise return the empty string.
    50  func (actor Actor) ResetSpaceIsolationSegment(orgGUID string, spaceGUID string) (string, Warnings, error) {
    51  	var allWarnings Warnings
    52  
    53  	_, apiWarnings, err := actor.CloudControllerClient.UpdateSpaceIsolationSegmentRelationship(spaceGUID, "")
    54  	allWarnings = append(allWarnings, apiWarnings...)
    55  	if err != nil {
    56  		return "", allWarnings, err
    57  	}
    58  
    59  	isoSegRelationship, apiWarnings, err := actor.CloudControllerClient.GetOrganizationDefaultIsolationSegment(orgGUID)
    60  	allWarnings = append(allWarnings, apiWarnings...)
    61  	if err != nil {
    62  		return "", allWarnings, err
    63  	}
    64  
    65  	var isoSegName string
    66  	if isoSegRelationship.GUID != "" {
    67  		isolationSegment, apiWarnings, err := actor.CloudControllerClient.GetIsolationSegment(isoSegRelationship.GUID)
    68  		allWarnings = append(allWarnings, apiWarnings...)
    69  		if err != nil {
    70  			return "", allWarnings, err
    71  		}
    72  		isoSegName = isolationSegment.Name
    73  	}
    74  
    75  	return isoSegName, allWarnings, nil
    76  }
    77  
    78  func (actor Actor) GetSpaceByNameAndOrganization(spaceName string, orgGUID string) (Space, Warnings, error) {
    79  	ccv3Spaces, warnings, err := actor.CloudControllerClient.GetSpaces(
    80  		ccv3.Query{Key: ccv3.NameFilter, Values: []string{spaceName}},
    81  		ccv3.Query{Key: ccv3.OrganizationGUIDFilter, Values: []string{orgGUID}},
    82  	)
    83  
    84  	if err != nil {
    85  		return Space{}, Warnings(warnings), err
    86  	}
    87  
    88  	if len(ccv3Spaces) == 0 {
    89  		return Space{}, Warnings(warnings), actionerror.SpaceNotFoundError{Name: spaceName}
    90  	}
    91  
    92  	return Space(ccv3Spaces[0]), Warnings(warnings), nil
    93  }
    94  
    95  func (actor Actor) GetSpaceSummaryByNameAndOrganization(spaceName string, orgGUID string) (SpaceSummary, Warnings, error) {
    96  	var allWarnings Warnings
    97  
    98  	org, warnings, err := actor.GetOrganizationByGUID(orgGUID)
    99  	allWarnings = append(allWarnings, warnings...)
   100  	if err != nil {
   101  		return SpaceSummary{}, allWarnings, err
   102  	}
   103  
   104  	space, warnings, err := actor.GetSpaceByNameAndOrganization(spaceName, org.GUID)
   105  	allWarnings = append(allWarnings, warnings...)
   106  	if err != nil {
   107  		return SpaceSummary{}, allWarnings, err
   108  	}
   109  
   110  	apps, warnings, err := actor.GetApplicationsBySpace(space.GUID)
   111  	allWarnings = append(allWarnings, warnings...)
   112  	if err != nil {
   113  		return SpaceSummary{}, allWarnings, err
   114  	}
   115  
   116  	appNames := make([]string, len(apps))
   117  	for i, app := range apps {
   118  		appNames[i] = app.Name
   119  	}
   120  	sort.Strings(appNames)
   121  
   122  	serviceInstances, ccv3Warnings, err := actor.CloudControllerClient.GetServiceInstances(
   123  		ccv3.Query{
   124  			Key:    ccv3.SpaceGUIDFilter,
   125  			Values: []string{space.GUID},
   126  		})
   127  	allWarnings = append(allWarnings, Warnings(ccv3Warnings)...)
   128  	if err != nil {
   129  		return SpaceSummary{}, allWarnings, err
   130  	}
   131  
   132  	serviceInstanceNames := make([]string, len(serviceInstances))
   133  	for i, instance := range serviceInstances {
   134  		serviceInstanceNames[i] = instance.Name
   135  	}
   136  	sort.Strings(serviceInstanceNames)
   137  
   138  	isoSegRelationship, ccv3Warnings, err := actor.CloudControllerClient.GetSpaceIsolationSegment(space.GUID)
   139  	allWarnings = append(allWarnings, Warnings(ccv3Warnings)...)
   140  	if err != nil {
   141  		return SpaceSummary{}, allWarnings, err
   142  	}
   143  
   144  	isoSegName := ""
   145  	isoSegGUID := isoSegRelationship.GUID
   146  	isDefaultIsoSeg := false
   147  
   148  	if isoSegGUID == "" {
   149  		defaultIsoSeg, ccv3Warnings, err := actor.CloudControllerClient.GetOrganizationDefaultIsolationSegment(org.GUID)
   150  		allWarnings = append(allWarnings, Warnings(ccv3Warnings)...)
   151  		if err != nil {
   152  			return SpaceSummary{}, allWarnings, err
   153  		}
   154  		isoSegGUID = defaultIsoSeg.GUID
   155  		if isoSegGUID != "" {
   156  			isDefaultIsoSeg = true
   157  		}
   158  	}
   159  
   160  	if isoSegGUID != "" {
   161  		isoSeg, ccv3warnings, err := actor.CloudControllerClient.GetIsolationSegment(isoSegGUID)
   162  		allWarnings = append(allWarnings, Warnings(ccv3warnings)...)
   163  		if err != nil {
   164  			return SpaceSummary{}, allWarnings, err
   165  		}
   166  		if isDefaultIsoSeg {
   167  			isoSegName = fmt.Sprintf("%s (org default)", isoSeg.Name)
   168  		} else {
   169  			isoSegName = isoSeg.Name
   170  		}
   171  	}
   172  
   173  	spaceSummary := SpaceSummary{
   174  		OrgName:              org.Name,
   175  		Name:                 space.Name,
   176  		Space:                space,
   177  		AppNames:             appNames,
   178  		ServiceInstanceNames: serviceInstanceNames,
   179  		IsolationSegmentName: isoSegName,
   180  	}
   181  
   182  	return spaceSummary, allWarnings, nil
   183  }
   184  
   185  // GetOrganizationSpacesWithLabelSelector returns a list of spaces in the specified org
   186  func (actor Actor) GetOrganizationSpacesWithLabelSelector(orgGUID string, labelSelector string) ([]Space, Warnings, error) {
   187  
   188  	queries := []ccv3.Query{
   189  		ccv3.Query{Key: ccv3.OrganizationGUIDFilter, Values: []string{orgGUID}},
   190  		ccv3.Query{Key: ccv3.OrderBy, Values: []string{ccv3.NameOrder}},
   191  	}
   192  	if len(labelSelector) > 0 {
   193  		queries = append(queries, ccv3.Query{Key: ccv3.LabelSelectorFilter, Values: []string{labelSelector}})
   194  	}
   195  
   196  	ccv3Spaces, warnings, err := actor.CloudControllerClient.GetSpaces(queries...)
   197  	if err != nil {
   198  		return []Space{}, Warnings(warnings), err
   199  	}
   200  
   201  	spaces := make([]Space, len(ccv3Spaces))
   202  	for i, ccv3Space := range ccv3Spaces {
   203  		spaces[i] = Space(ccv3Space)
   204  	}
   205  
   206  	return spaces, Warnings(warnings), nil
   207  }
   208  
   209  // GetOrganizationSpaces returns a list of spaces in the specified org
   210  func (actor Actor) GetOrganizationSpaces(orgGUID string) ([]Space, Warnings, error) {
   211  	return actor.GetOrganizationSpacesWithLabelSelector(orgGUID, "")
   212  }
   213  
   214  func (actor Actor) DeleteSpaceByNameAndOrganizationName(spaceName string, orgName string) (Warnings, error) {
   215  	var allWarnings Warnings
   216  
   217  	org, actorWarnings, err := actor.GetOrganizationByName(orgName)
   218  	allWarnings = append(allWarnings, actorWarnings...)
   219  	if err != nil {
   220  		return allWarnings, err
   221  	}
   222  
   223  	space, warnings, err := actor.GetSpaceByNameAndOrganization(spaceName, org.GUID)
   224  	allWarnings = append(allWarnings, warnings...)
   225  	if err != nil {
   226  		return allWarnings, err
   227  	}
   228  
   229  	jobURL, deleteWarnings, err := actor.CloudControllerClient.DeleteSpace(space.GUID)
   230  	allWarnings = append(allWarnings, Warnings(deleteWarnings)...)
   231  	if err != nil {
   232  		return allWarnings, err
   233  	}
   234  
   235  	ccWarnings, err := actor.CloudControllerClient.PollJob(jobURL)
   236  	allWarnings = append(allWarnings, Warnings(ccWarnings)...)
   237  
   238  	return allWarnings, err
   239  }
   240  
   241  func (actor Actor) RenameSpaceByNameAndOrganizationGUID(oldSpaceName, newSpaceName, orgGUID string) (Space, Warnings, error) {
   242  	var allWarnings Warnings
   243  
   244  	space, getWarnings, err := actor.GetSpaceByNameAndOrganization(oldSpaceName, orgGUID)
   245  	allWarnings = append(allWarnings, getWarnings...)
   246  	if err != nil {
   247  		return Space{}, allWarnings, err
   248  	}
   249  
   250  	ccSpace, updateWarnings, err := actor.CloudControllerClient.UpdateSpace(ccv3.Space{GUID: space.GUID, Name: newSpaceName})
   251  	allWarnings = append(allWarnings, Warnings(updateWarnings)...)
   252  
   253  	return Space(ccSpace), allWarnings, err
   254  }