github.com/IBM-Cloud/bluemix-go@v0.0.0-20240423071914-9e96525baef4/api/resource/resourcev1/management/resource_group.go (about)

     1  package management
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/IBM-Cloud/bluemix-go/bmxerror"
     7  	"github.com/IBM-Cloud/bluemix-go/client"
     8  	"github.com/IBM-Cloud/bluemix-go/models"
     9  	"github.com/IBM-Cloud/bluemix-go/rest"
    10  )
    11  
    12  //ResourceGroupUpdateRequest ...
    13  type ResourceGroupUpdateRequest struct {
    14  	Name    string `json:"name,omitempty"`
    15  	QuotaID string `json:"quota_id,omitempty"`
    16  	Default *bool  `json:"default,omitempty"`
    17  }
    18  
    19  // ResourceGroupQuery is the query filters to get resource groups
    20  type ResourceGroupQuery struct {
    21  	AccountID      string
    22  	Default        bool
    23  	ResourceID     string
    24  	ResourceOrigin models.ResourceOrigin
    25  }
    26  
    27  //ErrCodeResourceGroupDoesnotExist ...
    28  const ErrCodeResourceGroupDoesnotExist = "ResourceGroupDoesnotExist"
    29  
    30  //ResourceGroupQuery ...
    31  type ResourceGroupRepository interface {
    32  	// List all available resource groups
    33  	List(*ResourceGroupQuery) ([]models.ResourceGroup, error)
    34  	// Get resource group by ID
    35  	Get(id string) (*models.ResourceGroup, error)
    36  	// Find resource groups having the specific name
    37  	FindByName(*ResourceGroupQuery, string) ([]models.ResourceGroup, error)
    38  	// Create a new resource group
    39  	Create(models.ResourceGroup) (*models.ResourceGroup, error)
    40  	// Delete an existing resource group
    41  	Delete(id string) error
    42  	// Update an existing resource group
    43  	Update(id string, request *ResourceGroupUpdateRequest) (*models.ResourceGroup, error)
    44  }
    45  
    46  type resourceGroup struct {
    47  	client *client.Client
    48  }
    49  
    50  func newResourceGroupAPI(c *client.Client) ResourceGroupRepository {
    51  	return &resourceGroup{
    52  		client: c,
    53  	}
    54  }
    55  
    56  // populate query part of HTTP requests
    57  func (q ResourceGroupQuery) MakeRequest(r *rest.Request) *rest.Request {
    58  	if q.AccountID != "" {
    59  		r.Query("account_id", q.AccountID)
    60  	}
    61  	if q.Default {
    62  		r.Query("default", "true")
    63  	}
    64  	if q.ResourceID != "" {
    65  		r.Query("resource_id", q.ResourceID)
    66  	}
    67  	if q.ResourceOrigin != "" {
    68  		r.Query("resource_origin", q.ResourceOrigin.String())
    69  	}
    70  	return r
    71  }
    72  
    73  func (r *resourceGroup) List(query *ResourceGroupQuery) ([]models.ResourceGroup, error) {
    74  	listRequest := rest.GetRequest("/v1/resource_groups")
    75  	if query != nil {
    76  		query.MakeRequest(listRequest)
    77  	}
    78  	req, err := listRequest.Build()
    79  	if err != nil {
    80  		return []models.ResourceGroup{}, err
    81  	}
    82  
    83  	var groups []models.ResourceGroup
    84  	_, err = r.client.GetPaginated(
    85  		req.URL.String(),
    86  		NewRCPaginatedResources(models.ResourceGroup{}),
    87  		func(resource interface{}) bool {
    88  			if group, ok := resource.(models.ResourceGroup); ok {
    89  				groups = append(groups, group)
    90  				return true
    91  			}
    92  			return false
    93  		},
    94  	)
    95  
    96  	if err != nil {
    97  		return []models.ResourceGroup{}, err
    98  	}
    99  
   100  	return groups, nil
   101  }
   102  
   103  func (r *resourceGroup) FindByName(query *ResourceGroupQuery, name string) ([]models.ResourceGroup, error) {
   104  	groups, err := r.List(query)
   105  	if err != nil {
   106  		return []models.ResourceGroup{}, err
   107  	}
   108  
   109  	filteredGroups := []models.ResourceGroup{}
   110  	for _, group := range groups {
   111  		if group.Name == name {
   112  			filteredGroups = append(filteredGroups, group)
   113  		}
   114  	}
   115  
   116  	if len(filteredGroups) == 0 {
   117  		return filteredGroups, bmxerror.New(ErrCodeResourceGroupDoesnotExist,
   118  			fmt.Sprintf("Given resource Group : %q doesn't exist", name))
   119  
   120  	}
   121  	return filteredGroups, nil
   122  }
   123  
   124  func (r *resourceGroup) Create(group models.ResourceGroup) (*models.ResourceGroup, error) {
   125  	newGroup := models.ResourceGroup{}
   126  	_, err := r.client.Post("/v1/resource_groups", &group, &newGroup)
   127  	if err != nil {
   128  		return nil, err
   129  	}
   130  	return &newGroup, nil
   131  }
   132  
   133  func (r *resourceGroup) Delete(id string) error {
   134  	_, err := r.client.Delete("/v1/resource_groups/" + id)
   135  	return err
   136  }
   137  
   138  func (r *resourceGroup) Update(id string, request *ResourceGroupUpdateRequest) (*models.ResourceGroup, error) {
   139  	updatedGroup := models.ResourceGroup{}
   140  	_, err := r.client.Patch("/v1/resource_groups/"+id, request, &updatedGroup)
   141  	if err != nil {
   142  		return nil, err
   143  	}
   144  	return &updatedGroup, nil
   145  }
   146  
   147  func (r *resourceGroup) Get(id string) (*models.ResourceGroup, error) {
   148  	group := models.ResourceGroup{}
   149  	_, err := r.client.Get("/v1/resource_groups/"+id, &group)
   150  	if err != nil {
   151  		return nil, err
   152  	}
   153  	return &group, nil
   154  }