fc217f6ce4
Cleaned up all the minor rubocop issues, the ones left relate to complex logic and what I think is a bug in rubocop for nested vs compact modules/class definitions. Change-Id: Ic0c0677de44642e0994c0b95a3c270cbd4749b40
159 lines
5.0 KiB
Ruby
159 lines
5.0 KiB
Ruby
# encoding: UTF-8
|
|
|
|
#
|
|
# Cookbook Name:: openstack-common
|
|
# library:: endpoints
|
|
#
|
|
# Copyright 2012-2013, AT&T Services, Inc.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
#
|
|
|
|
require 'uri'
|
|
|
|
# Endpoint methods
|
|
module ::Openstack
|
|
# Shortcut to get the full URI for an endpoint, and return it as a URI object
|
|
# First we get the attribute hash for the endpoint, using endpoint_for().
|
|
# Then we call uri_from_hash(). If the hash has a 'uri' key,
|
|
# this gets converted to a URI object and returned. If not, a URI object is
|
|
# constructed from the endpoint parts in the endpoint hash, and returned
|
|
def endpoint(name)
|
|
ep = endpoint_for(name)
|
|
uri_from_hash(ep) if ep
|
|
end
|
|
|
|
# Useful for iterating over the OpenStack endpoints
|
|
def endpoints(&block)
|
|
node['openstack']['endpoints'].each do |name, info|
|
|
block.call(name, info)
|
|
end
|
|
rescue
|
|
nil
|
|
end
|
|
|
|
# Instead of specifying the verbose node['openstack']['db'][service],
|
|
# this shortcut allows the simpler and shorter db(service), where
|
|
# service can be: 'compute', 'image', 'identity', 'network', etc.
|
|
def db(service)
|
|
node['openstack']['db'][service]
|
|
rescue
|
|
nil
|
|
end
|
|
|
|
# Shortcut to get the SQLAlchemy DB URI for a named service
|
|
def db_uri(service, user, pass) # rubocop:disable MethodLength, CyclomaticComplexity
|
|
info = db(service)
|
|
return unless info
|
|
host = info['host']
|
|
port = info['port'].to_s
|
|
type = info['service_type']
|
|
name = info['db_name']
|
|
options = info['options'][type]
|
|
|
|
# Normalize to the SQLAlchemy standard db type identifier
|
|
case type
|
|
when 'db2'
|
|
# NoSQL is used for telemetry in the DB2 case
|
|
if service == 'telemetry' && node['openstack']['db']['telemetry']['nosql']['used']
|
|
options = info['options']['nosql']
|
|
port = info['nosql']['port']
|
|
type = 'db2'
|
|
else
|
|
type = 'ibm_db_sa'
|
|
end
|
|
when 'pgsql'
|
|
type = 'postgresql'
|
|
when 'mariadb'
|
|
type = 'mysql'
|
|
end
|
|
|
|
# Build uri
|
|
case type
|
|
when 'mysql', 'postgresql', 'db2', 'ibm_db_sa'
|
|
"#{type}://#{user}:#{pass}@#{host}:#{port}/#{name}#{options}"
|
|
when 'sqlite'
|
|
# SQLite uses filepaths not db name
|
|
# README(galstrom): 3 slashes is a relative path, 4 slashes is an absolute path
|
|
# example: info['path'] = 'path/to/foo.db' -- will return sqlite:///foo.db
|
|
# example: info['path'] = '/path/to/foo.db' -- will return sqlite:////foo.db
|
|
path = info['path']
|
|
"#{type}:///#{path}#{options}"
|
|
end
|
|
end
|
|
|
|
# Return the address for the hash.
|
|
#
|
|
# If the bind_interface is set, then return the first IP on the interface.
|
|
# otherwise return the IP specified in the host attribute.
|
|
def address(hash)
|
|
bind_interface = hash['bind_interface'] if hash['bind_interface']
|
|
|
|
if bind_interface
|
|
return address_for bind_interface
|
|
else
|
|
return hash['host']
|
|
end
|
|
end
|
|
|
|
# Get the admin endpoint for the specified service.
|
|
# If there's no specific endpoint, then get the general service endpoint.
|
|
def admin_endpoint(name)
|
|
ep = specific_endpoint('admin', name)
|
|
uri_from_hash(ep) if ep
|
|
end
|
|
|
|
# Get the public endpoint for the specified service.
|
|
# If there's no specific endpoint, then get the general service endpoint.
|
|
def public_endpoint(name)
|
|
ep = specific_endpoint('public', name)
|
|
uri_from_hash(ep) if ep
|
|
end
|
|
|
|
# Get the internal endpoint for the specified service.
|
|
# If there's no specific endpoint, then get the general service endpoint.
|
|
def internal_endpoint(name)
|
|
ep = specific_endpoint('internal', name)
|
|
uri_from_hash(ep) if ep
|
|
end
|
|
|
|
private
|
|
|
|
# Instead of specifying the verbose node['openstack']['endpoints'][name],
|
|
# this shortcut allows the simpler and shorter endpoint(name)
|
|
def endpoint_for(name)
|
|
node['openstack']['endpoints'][name]
|
|
rescue
|
|
nil
|
|
end
|
|
|
|
# Attempt to find the specific endpoint type ('internal', 'admin', or
|
|
# 'public') for the given name. If it's not found, then return the
|
|
# general endpoint.
|
|
def specific_endpoint(type, name)
|
|
if node['openstack']['endpoints'][type].include? name
|
|
node['openstack']['endpoints'][type][name]
|
|
else
|
|
# There may have been a subhash for the specified type, but it
|
|
# didn't have the name we were looking for (and didn't throw
|
|
# an exception either). In this case, attempt to use the general
|
|
# endpoit
|
|
endpoint_for(name)
|
|
end
|
|
rescue
|
|
# Problem doing hash lookups for requested type of endpoint. Use
|
|
# general endpoint instead
|
|
endpoint_for(name)
|
|
end
|
|
end
|