#!/usr/bin/env python # vim: tabstop=4 shiftwidth=4 softtabstop=4 # # 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. """ This is the administration program for heat. It is simply a command-line interface for adding, modifying, and retrieving information about the stacks belonging to a user. It is a convenience application that talks to the heat API server. """ import gettext import optparse import os import os.path import sys import time import json import logging import httplib from urlparse import urlparse # If ../heat/__init__.py exists, add ../ to Python search path, so that # it will override what happens to be installed in /usr/(local/)lib/python... possible_topdir = os.path.normpath(os.path.join(os.path.abspath(sys.argv[0]), os.pardir, os.pardir)) if os.path.exists(os.path.join(possible_topdir, 'heat', '__init__.py')): sys.path.insert(0, possible_topdir) scriptname = os.path.basename(sys.argv[0]) gettext.install('heat', unicode=1) if scriptname == 'heat-boto': from heat import boto_client as heat_client else: from heat import client as heat_client from heat import version from heat.common import config from heat.common import exception from heat import utils from keystoneclient.v2_0 import client def get_swift_template(options): ''' Retrieve a template from the swift object store, using the provided URL. We request a keystone token to authenticate ''' template_body = None if options.auth_strategy == 'keystone': # we use the keystone credentials to get a token # to pass in the request header keystone = client.Client(username=options.username, password=options.password, tenant_name=options.tenant, auth_url=options.auth_url) logging.info("Getting template from swift URL: %s" % options.template_object) url = urlparse(options.template_object) if url.scheme == 'https': conn = httplib.HTTPSConnection(url.netloc) else: conn = httplib.HTTPConnection(url.netloc) headers = {'X-Auth-Token': keystone.auth_token} conn.request("GET", url.path, headers=headers) r1 = conn.getresponse() logging.info('status %d' % r1.status) if r1.status == 200: template_body = r1.read() conn.close() else: logging.error("template-object option requires keystone") return template_body def get_template_param(options): ''' Helper function to extract the template in whatever format has been specified by the cli options ''' param = {} if options.template_file: param['TemplateBody'] = open(options.template_file).read() elif options.template_url: param['TemplateUrl'] = options.template_url elif options.template_object: template_body = get_swift_template(options) if template_body: param['TemplateBody'] = template_body else: logging.error("Error reading swift template") return param @utils.catch_error('validate') def template_validate(options, arguments): ''' Validate a template. This command parses a template and verifies that it is in the correct format. Usage: heat-cfn validate \\ [--template-file=