github.com/vnpaycloud-console/gophercloud/v2@v2.0.5/openstack/image/v2/members/requests.go (about)

     1  package members
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/vnpaycloud-console/gophercloud/v2"
     7  	"github.com/vnpaycloud-console/gophercloud/v2/pagination"
     8  )
     9  
    10  /*
    11  Create member for specific image
    12  
    13  # Preconditions
    14  
    15    - The specified images must exist.
    16    - You can only add a new member to an image which 'visibility' attribute is
    17      private.
    18    - You must be the owner of the specified image.
    19  
    20  # Synchronous Postconditions
    21  
    22  With correct permissions, you can see the member status of the image as
    23  pending through API calls.
    24  
    25  More details here:
    26  http://developer.openstack.org/api-ref-image-v2.html#createImageMember-v2
    27  */
    28  func Create(ctx context.Context, client *gophercloud.ServiceClient, id string, member string) (r CreateResult) {
    29  	b := map[string]any{"member": member}
    30  	resp, err := client.Post(ctx, createMemberURL(client, id), b, &r.Body, &gophercloud.RequestOpts{
    31  		OkCodes: []int{200},
    32  	})
    33  	_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
    34  	return
    35  }
    36  
    37  // List members returns list of members for specifed image id.
    38  func List(client *gophercloud.ServiceClient, id string) pagination.Pager {
    39  	return pagination.NewPager(client, listMembersURL(client, id), func(r pagination.PageResult) pagination.Page {
    40  		return MemberPage{pagination.SinglePageBase(r)}
    41  	})
    42  }
    43  
    44  // Get image member details.
    45  func Get(ctx context.Context, client *gophercloud.ServiceClient, imageID string, memberID string) (r DetailsResult) {
    46  	resp, err := client.Get(ctx, getMemberURL(client, imageID, memberID), &r.Body, &gophercloud.RequestOpts{OkCodes: []int{200}})
    47  	_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
    48  	return
    49  }
    50  
    51  // Delete membership for given image. Callee should be image owner.
    52  func Delete(ctx context.Context, client *gophercloud.ServiceClient, imageID string, memberID string) (r DeleteResult) {
    53  	resp, err := client.Delete(ctx, deleteMemberURL(client, imageID, memberID), &gophercloud.RequestOpts{OkCodes: []int{204}})
    54  	_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
    55  	return
    56  }
    57  
    58  // UpdateOptsBuilder allows extensions to add additional attributes to the
    59  // Update request.
    60  type UpdateOptsBuilder interface {
    61  	ToImageMemberUpdateMap() (map[string]any, error)
    62  }
    63  
    64  // UpdateOpts represents options to an Update request.
    65  type UpdateOpts struct {
    66  	Status string
    67  }
    68  
    69  // ToMemberUpdateMap formats an UpdateOpts structure into a request body.
    70  func (opts UpdateOpts) ToImageMemberUpdateMap() (map[string]any, error) {
    71  	return map[string]any{
    72  		"status": opts.Status,
    73  	}, nil
    74  }
    75  
    76  // Update function updates member.
    77  func Update(ctx context.Context, client *gophercloud.ServiceClient, imageID string, memberID string, opts UpdateOptsBuilder) (r UpdateResult) {
    78  	b, err := opts.ToImageMemberUpdateMap()
    79  	if err != nil {
    80  		r.Err = err
    81  		return
    82  	}
    83  	resp, err := client.Put(ctx, updateMemberURL(client, imageID, memberID), b, &r.Body,
    84  		&gophercloud.RequestOpts{OkCodes: []int{200}})
    85  	_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
    86  	return
    87  }