github.com/gophercloud/gophercloud@v1.11.0/openstack/compute/v2/extensions/keypairs/requests.go (about)

     1  package keypairs
     2  
     3  import (
     4  	"github.com/gophercloud/gophercloud"
     5  	"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
     6  	"github.com/gophercloud/gophercloud/pagination"
     7  )
     8  
     9  // CreateOptsExt adds a KeyPair option to the base CreateOpts.
    10  type CreateOptsExt struct {
    11  	servers.CreateOptsBuilder
    12  
    13  	// KeyName is the name of the key pair.
    14  	KeyName string `json:"key_name,omitempty"`
    15  }
    16  
    17  // ToServerCreateMap adds the key_name to the base server creation options.
    18  func (opts CreateOptsExt) ToServerCreateMap() (map[string]interface{}, error) {
    19  	base, err := opts.CreateOptsBuilder.ToServerCreateMap()
    20  	if err != nil {
    21  		return nil, err
    22  	}
    23  
    24  	if opts.KeyName == "" {
    25  		return base, nil
    26  	}
    27  
    28  	serverMap := base["server"].(map[string]interface{})
    29  	serverMap["key_name"] = opts.KeyName
    30  
    31  	return base, nil
    32  }
    33  
    34  // ListOptsBuilder allows extensions to add additional parameters to the
    35  // List request.
    36  type ListOptsBuilder interface {
    37  	ToKeyPairListQuery() (string, error)
    38  }
    39  
    40  // ListOpts enables listing KeyPairs based on specific attributes.
    41  type ListOpts struct {
    42  	// UserID is the user ID that owns the key pair.
    43  	// This requires microversion 2.10 or higher.
    44  	UserID string `q:"user_id"`
    45  }
    46  
    47  // ToKeyPairListQuery formats a ListOpts into a query string.
    48  func (opts ListOpts) ToKeyPairListQuery() (string, error) {
    49  	q, err := gophercloud.BuildQueryString(opts)
    50  	return q.String(), err
    51  }
    52  
    53  // List returns a Pager that allows you to iterate over a collection of KeyPairs.
    54  func List(client *gophercloud.ServiceClient, opts ListOptsBuilder) pagination.Pager {
    55  	url := listURL(client)
    56  	if opts != nil {
    57  		query, err := opts.ToKeyPairListQuery()
    58  		if err != nil {
    59  			return pagination.Pager{Err: err}
    60  		}
    61  		url += query
    62  	}
    63  	return pagination.NewPager(client, url, func(r pagination.PageResult) pagination.Page {
    64  		return KeyPairPage{pagination.SinglePageBase(r)}
    65  	})
    66  }
    67  
    68  // CreateOptsBuilder allows extensions to add additional parameters to the
    69  // Create request.
    70  type CreateOptsBuilder interface {
    71  	ToKeyPairCreateMap() (map[string]interface{}, error)
    72  }
    73  
    74  // CreateOpts specifies KeyPair creation or import parameters.
    75  type CreateOpts struct {
    76  	// Name is a friendly name to refer to this KeyPair in other services.
    77  	Name string `json:"name" required:"true"`
    78  
    79  	// UserID [optional] is the user_id for a keypair.
    80  	// This allows administrative users to upload keys for other users than themselves.
    81  	// This requires microversion 2.10 or higher.
    82  	UserID string `json:"user_id,omitempty"`
    83  
    84  	// The type of the keypair. Allowed values are ssh or x509
    85  	// This requires microversion 2.2 or higher.
    86  	Type string `json:"type,omitempty"`
    87  
    88  	// PublicKey [optional] is a pregenerated OpenSSH-formatted public key.
    89  	// If provided, this key will be imported and no new key will be created.
    90  	PublicKey string `json:"public_key,omitempty"`
    91  }
    92  
    93  // ToKeyPairCreateMap constructs a request body from CreateOpts.
    94  func (opts CreateOpts) ToKeyPairCreateMap() (map[string]interface{}, error) {
    95  	return gophercloud.BuildRequestBody(opts, "keypair")
    96  }
    97  
    98  // Create requests the creation of a new KeyPair on the server, or to import a
    99  // pre-existing keypair.
   100  func Create(client *gophercloud.ServiceClient, opts CreateOptsBuilder) (r CreateResult) {
   101  	b, err := opts.ToKeyPairCreateMap()
   102  	if err != nil {
   103  		r.Err = err
   104  		return
   105  	}
   106  	resp, err := client.Post(createURL(client), b, &r.Body, &gophercloud.RequestOpts{
   107  		OkCodes: []int{200, 201},
   108  	})
   109  	_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
   110  	return
   111  }
   112  
   113  // GetOptsBuilder allows extensions to add additional parameters to the
   114  // Get request.
   115  type GetOptsBuilder interface {
   116  	ToKeyPairGetQuery() (string, error)
   117  }
   118  
   119  // GetOpts enables retrieving KeyPairs based on specific attributes.
   120  type GetOpts struct {
   121  	// UserID is the user ID that owns the key pair.
   122  	// This requires microversion 2.10 or higher.
   123  	UserID string `q:"user_id"`
   124  }
   125  
   126  // ToKeyPairGetQuery formats a GetOpts into a query string.
   127  func (opts GetOpts) ToKeyPairGetQuery() (string, error) {
   128  	q, err := gophercloud.BuildQueryString(opts)
   129  	return q.String(), err
   130  }
   131  
   132  // Get returns public data about a previously uploaded KeyPair.
   133  func Get(client *gophercloud.ServiceClient, name string, opts GetOptsBuilder) (r GetResult) {
   134  	url := getURL(client, name)
   135  	if opts != nil {
   136  		query, err := opts.ToKeyPairGetQuery()
   137  		if err != nil {
   138  			r.Err = err
   139  			return
   140  		}
   141  		url += query
   142  	}
   143  
   144  	resp, err := client.Get(url, &r.Body, nil)
   145  	_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
   146  	return
   147  }
   148  
   149  // DeleteOptsBuilder allows extensions to add additional parameters to the
   150  // Delete request.
   151  type DeleteOptsBuilder interface {
   152  	ToKeyPairDeleteQuery() (string, error)
   153  }
   154  
   155  // DeleteOpts enables deleting KeyPairs based on specific attributes.
   156  type DeleteOpts struct {
   157  	// UserID is the user ID of the user that owns the key pair.
   158  	// This requires microversion 2.10 or higher.
   159  	UserID string `q:"user_id"`
   160  }
   161  
   162  // ToKeyPairDeleteQuery formats a DeleteOpts into a query string.
   163  func (opts DeleteOpts) ToKeyPairDeleteQuery() (string, error) {
   164  	q, err := gophercloud.BuildQueryString(opts)
   165  	return q.String(), err
   166  }
   167  
   168  // Delete requests the deletion of a previous stored KeyPair from the server.
   169  func Delete(client *gophercloud.ServiceClient, name string, opts DeleteOptsBuilder) (r DeleteResult) {
   170  	url := deleteURL(client, name)
   171  	if opts != nil {
   172  		query, err := opts.ToKeyPairDeleteQuery()
   173  		if err != nil {
   174  			r.Err = err
   175  			return
   176  		}
   177  		url += query
   178  	}
   179  
   180  	resp, err := client.Delete(url, nil)
   181  	_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
   182  	return
   183  }