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 }