cookbook-openstack-common/libraries/endpoints.rb
Mark Vanderwiel fc217f6ce4 Cleanup minor rubocop offenses
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
2015-06-02 11:45:59 -05:00

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