github.com/mmatczuk/gohan@v0.0.0-20170206152520-30e45d9bdb69/extension/gohanscript/lib/openstack.go (about) 1 // Copyright (C) 2016 Juniper Networks, Inc. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 12 // implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 16 package lib 17 18 import ( 19 "fmt" 20 "net/http" 21 "net/url" 22 "time" 23 24 "github.com/cloudwan/gohan/cloud" 25 "github.com/rackspace/gophercloud" 26 "github.com/rackspace/gophercloud/openstack" 27 ) 28 29 func newClient(endpoint string) (*gophercloud.ProviderClient, error) { 30 u, err := url.Parse(endpoint) 31 if err != nil { 32 return nil, err 33 } 34 hadPath := u.Path != "" 35 u.Path, u.RawQuery, u.Fragment = "", "", "" 36 base := u.String() 37 38 endpoint = gophercloud.NormalizeURL(endpoint) 39 base = gophercloud.NormalizeURL(base) 40 timeout := time.Duration(20 * time.Second) 41 42 if !hadPath { 43 endpoint = "" 44 } 45 return &gophercloud.ProviderClient{ 46 IdentityBase: base, 47 IdentityEndpoint: endpoint, 48 HTTPClient: http.Client{ 49 Timeout: timeout, 50 }, 51 }, nil 52 53 } 54 55 func authenticatedClient(options gophercloud.AuthOptions) (*gophercloud.ProviderClient, error) { 56 client, err := newClient(options.IdentityEndpoint) 57 if err != nil { 58 return nil, err 59 } 60 61 err = openstack.Authenticate(client, options) 62 if err != nil { 63 return nil, err 64 } 65 return client, nil 66 } 67 68 //GetOpenstackClient makes openstack client 69 func GetOpenstackClient(authURL, userName, password, domainName, tenantName, tenantID, version string) (*gophercloud.ServiceClient, error) { 70 opts := gophercloud.AuthOptions{ 71 IdentityEndpoint: authURL, 72 Username: userName, 73 Password: password, 74 DomainName: domainName, 75 TenantName: tenantName, 76 TenantID: tenantID, 77 AllowReauth: true, 78 } 79 80 client, err := openstack.AuthenticatedClient(opts) 81 if err != nil { 82 return nil, err 83 } 84 client.HTTPClient = cloud.NewHTTPClient() 85 if version == "v2.0" { 86 return openstack.NewIdentityV2(client), nil 87 } else if version == "v3" { 88 return openstack.NewIdentityV3(client), nil 89 } else { 90 return nil, fmt.Errorf("Unsupported keystone version: %s", version) 91 } 92 } 93 94 //OpenstackToken get auth token from client 95 func OpenstackToken(client *gophercloud.ServiceClient) string { 96 return client.TokenID 97 } 98 99 //OpenstackGet gets a resource using OpenStack API 100 func OpenstackGet(client *gophercloud.ServiceClient, url string) (interface{}, error) { 101 var response interface{} 102 _, err := client.Get(url, &response, nil) 103 if err != nil { 104 return nil, err 105 } 106 return response, nil 107 } 108 109 //OpenstackEnsure keep resource status to sync 110 func OpenstackEnsure(client *gophercloud.ServiceClient, url string, postURL string, data interface{}) (interface{}, error) { 111 var response interface{} 112 resp, err := client.Get(url, &response, nil) 113 if err != nil { 114 if resp.StatusCode != http.StatusNotFound { 115 return nil, err 116 } 117 return OpenstackPost(client, postURL, data) 118 } 119 return OpenstackPut(client, url, data) 120 } 121 122 //OpenstackPut puts a resource using OpenStack API 123 func OpenstackPut(client *gophercloud.ServiceClient, url string, data interface{}) (interface{}, error) { 124 var response interface{} 125 _, err := client.Put(url, data, &response, &gophercloud.RequestOpts{ 126 OkCodes: []int{200, 201, 202}, 127 }) 128 if err != nil { 129 return nil, err 130 } 131 return response, nil 132 } 133 134 //OpenstackPost posts a resource using OpenStack API 135 func OpenstackPost(client *gophercloud.ServiceClient, url string, data interface{}) (interface{}, error) { 136 var response interface{} 137 _, err := client.Post(url, data, &response, &gophercloud.RequestOpts{ 138 OkCodes: []int{200, 201, 202}, 139 }) 140 if err != nil { 141 return nil, err 142 } 143 return response, nil 144 } 145 146 //OpenstackDelete deletes a resource using OpenStack API 147 func OpenstackDelete(client *gophercloud.ServiceClient, url string) (interface{}, error) { 148 _, err := client.Delete(url, &gophercloud.RequestOpts{ 149 OkCodes: []int{200, 201, 202, 204, 404}, 150 }) 151 if err != nil { 152 return nil, err 153 } 154 return nil, nil 155 } 156 157 //OpenstackEndpoint returns API endpoint for each service name 158 func OpenstackEndpoint(client *gophercloud.ServiceClient, endpointType, name, region, availability string) (interface{}, error) { 159 if availability == "" { 160 availability = "public" 161 } 162 return client.EndpointLocator( 163 gophercloud.EndpointOpts{ 164 Type: endpointType, 165 Name: name, 166 Region: region, 167 Availability: gophercloud.Availability(availability), 168 }) 169 }