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  }