Initialize fuel_plugin_builder project
This commit is contained in:
parent
4a4b59a0b6
commit
ac4a7f7a28
13
fuel_plugin_builder/fuel_plugin_builder/__init__.py
Normal file
13
fuel_plugin_builder/fuel_plugin_builder/__init__.py
Normal file
@ -0,0 +1,13 @@
|
||||
# Copyright 2014 Mirantis, 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.
|
18
fuel_plugin_builder/fuel_plugin_builder/actions/__init__.py
Normal file
18
fuel_plugin_builder/fuel_plugin_builder/actions/__init__.py
Normal file
@ -0,0 +1,18 @@
|
||||
# Copyright 2014 Mirantis, 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.
|
||||
|
||||
|
||||
from fuel_plugin_builder.actions.base import BaseAction
|
||||
from fuel_plugin_builder.actions.create import CreatePlugin
|
||||
from fuel_plugin_builder.actions.build import BuildPlugin
|
32
fuel_plugin_builder/fuel_plugin_builder/actions/base.py
Normal file
32
fuel_plugin_builder/fuel_plugin_builder/actions/base.py
Normal file
@ -0,0 +1,32 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright 2014 Mirantis, 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.
|
||||
|
||||
import abc
|
||||
import six
|
||||
|
||||
|
||||
@six.add_metaclass(abc.ABCMeta)
|
||||
class BaseAction(object):
|
||||
|
||||
@abc.abstractmethod
|
||||
def check(self):
|
||||
"""Check if it's possible to perform an action.
|
||||
"""
|
||||
|
||||
@abc.abstractmethod
|
||||
def run(self):
|
||||
"""Run an action.
|
||||
"""
|
59
fuel_plugin_builder/fuel_plugin_builder/actions/build.py
Normal file
59
fuel_plugin_builder/fuel_plugin_builder/actions/build.py
Normal file
@ -0,0 +1,59 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright 2014 Mirantis, 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.
|
||||
|
||||
import os
|
||||
import logging
|
||||
|
||||
from fuel_plugin_builder import utils
|
||||
from fuel_plugin_builder import errors
|
||||
from fuel_plugin_builder.actions import BaseAction
|
||||
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class BuildPlugin(BaseAction):
|
||||
|
||||
requires = ['rpm', 'createrepo', 'dpkg-scanpackages']
|
||||
|
||||
def __init__(self, plugin_path):
|
||||
self.plugin_path = plugin_path
|
||||
self.pre_build_hook_path = os.path.join(plugin_path, 'pre_build_hook')
|
||||
|
||||
self.centos_repo_path = os.path.join(plugin_path, 'repos/centos')
|
||||
self.ubuntu_repo_path = os.path.join(plugin_path, 'repos/ubuntu')
|
||||
|
||||
def run(self):
|
||||
if utils.which(self.pre_build_hook_path):
|
||||
utils.exec_cmd(self.pre_build_hook_path)
|
||||
|
||||
utils.exec_cmd(
|
||||
'createrepo -o {0} {1}'.format(
|
||||
os.path.join(self.centos_repo_path, 'x86_64'),
|
||||
os.path.join(self.centos_repo_path, 'x86_64', 'Packages')))
|
||||
utils.exec_cmd(
|
||||
'dpkg-scanpackages {0} | gzip -c9 > {1}'.format(
|
||||
self.ubuntu_repo_path,
|
||||
os.path.join(self.ubuntu_repo_path, 'Packages.gz')))
|
||||
|
||||
def check(self):
|
||||
not_found = filter(lambda r: not utils.which(r), self.requires)
|
||||
|
||||
if not_found:
|
||||
raise errors.FuelCannotFindCommandError(
|
||||
'Cannot find commands "{0}", '
|
||||
'install required commands and try again'.format(
|
||||
','.join(not_found)))
|
34
fuel_plugin_builder/fuel_plugin_builder/actions/create.py
Normal file
34
fuel_plugin_builder/fuel_plugin_builder/actions/create.py
Normal file
@ -0,0 +1,34 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright 2014 Mirantis, 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.
|
||||
|
||||
import logging
|
||||
|
||||
from fuel_plugin_builder.actions import BaseAction
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class CreatePlugin(BaseAction):
|
||||
|
||||
def __init__(self, plugin_name):
|
||||
self.plugin_name = plugin_name
|
||||
|
||||
|
||||
def check(self):
|
||||
pass
|
||||
|
||||
def run(self):
|
||||
pass
|
83
fuel_plugin_builder/fuel_plugin_builder/cli.py
Normal file
83
fuel_plugin_builder/fuel_plugin_builder/cli.py
Normal file
@ -0,0 +1,83 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright 2014 Mirantis, 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.
|
||||
|
||||
import sys
|
||||
import argparse
|
||||
|
||||
from fuel_plugin_builder import actions
|
||||
from fuel_plugin_builder import messages
|
||||
from fuel_plugin_builder import errors
|
||||
|
||||
from fuel_plugin_builder.logger import configure_logger
|
||||
logger = configure_logger()
|
||||
|
||||
|
||||
|
||||
def handle_exception(exc):
|
||||
logger.exception(exc)
|
||||
|
||||
if isinstance(exc, errors.FuelCannotFindCommandError):
|
||||
print(messages.header)
|
||||
print(messages.install_required_packages)
|
||||
|
||||
sys.exit(-1)
|
||||
|
||||
|
||||
def parse_args():
|
||||
"""Parse arguments and return them
|
||||
"""
|
||||
parser = argparse.ArgumentParser(
|
||||
description='fpb is a fuel plugin builder which '
|
||||
'helps you create plugin for Fuel')
|
||||
|
||||
group = parser.add_mutually_exclusive_group(required=True)
|
||||
|
||||
group.add_argument(
|
||||
'--create', help='create a plugin skeleton',
|
||||
nargs=1, metavar='plugin_name')
|
||||
group.add_argument(
|
||||
'--build', help='build a plugin',
|
||||
nargs=1, metavar='path_to_directory')
|
||||
|
||||
return parser.parse_args()
|
||||
|
||||
|
||||
def perform_action(args):
|
||||
"""Performs an action
|
||||
|
||||
:param args: argparse object
|
||||
"""
|
||||
|
||||
if args.create:
|
||||
plugin_name = args.create[0]
|
||||
logger.debug('Start plugin creation "%s"', args.create)
|
||||
action = actions.CreatePlugin(plugin_name)
|
||||
elif args.build:
|
||||
plugin_path = args.build[0]
|
||||
logger.debug('Start plugin building "%s"', args.build)
|
||||
action = actions.BuildPlugin(plugin_path)
|
||||
|
||||
action.check()
|
||||
action.run()
|
||||
|
||||
|
||||
def main():
|
||||
"""Entry point
|
||||
"""
|
||||
try:
|
||||
perform_action(parse_args())
|
||||
except Exception as exc:
|
||||
handle_exception(exc)
|
25
fuel_plugin_builder/fuel_plugin_builder/errors.py
Normal file
25
fuel_plugin_builder/fuel_plugin_builder/errors.py
Normal file
@ -0,0 +1,25 @@
|
||||
# Copyright 2014 Mirantis, 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.
|
||||
|
||||
|
||||
class FuelPluginException(Exception):
|
||||
pass
|
||||
|
||||
|
||||
class FuelCannotFindCommandError(Exception):
|
||||
pass
|
||||
|
||||
|
||||
class ExecutedErrorNonZeroExitCode(Exception):
|
||||
pass
|
33
fuel_plugin_builder/fuel_plugin_builder/logger.py
Normal file
33
fuel_plugin_builder/fuel_plugin_builder/logger.py
Normal file
@ -0,0 +1,33 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright 2014 Mirantis, 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.
|
||||
|
||||
import logging
|
||||
import sys
|
||||
|
||||
|
||||
def configure_logger():
|
||||
logger = logging.getLogger('fuel_plugin_builder')
|
||||
logger.setLevel(logging.DEBUG)
|
||||
formatter = logging.Formatter(
|
||||
'%(asctime)s %(levelname)s %(process)d (%(module)s) %(message)s',
|
||||
"%Y-%m-%d %H:%M:%S")
|
||||
|
||||
stream_handler = logging.StreamHandler()
|
||||
stream_handler.setLevel(logging.DEBUG)
|
||||
stream_handler.setFormatter(formatter)
|
||||
logger.addHandler(stream_handler)
|
||||
|
||||
return logger
|
25
fuel_plugin_builder/fuel_plugin_builder/messages.py
Normal file
25
fuel_plugin_builder/fuel_plugin_builder/messages.py
Normal file
@ -0,0 +1,25 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright 2014 Mirantis, 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.
|
||||
|
||||
|
||||
header = '=' * 50
|
||||
|
||||
|
||||
install_required_packages = """
|
||||
Was not able to find required packages, try to run:
|
||||
|
||||
# sudo apt-get install createrepo rpm dpkg-dev
|
||||
"""
|
87
fuel_plugin_builder/fuel_plugin_builder/utils.py
Normal file
87
fuel_plugin_builder/fuel_plugin_builder/utils.py
Normal file
@ -0,0 +1,87 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright 2014 Mirantis, 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.
|
||||
|
||||
|
||||
import os
|
||||
import logging
|
||||
|
||||
import subprocess
|
||||
|
||||
from fuel_plugin_builder import errors
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def is_executable(file_path):
|
||||
"""Checks if file executable
|
||||
|
||||
:param str file_path: path to the file
|
||||
:returns: True if file is executable, False if is not
|
||||
"""
|
||||
return os.path.isfile(file_path) and os.access(file_path, os.X_OK)
|
||||
|
||||
|
||||
def which(cmd):
|
||||
"""Checks if file executable
|
||||
|
||||
:param str cmd: the name of the command or path
|
||||
|
||||
:returns: None if there is no such command,
|
||||
if there is such command returns
|
||||
the path to the command
|
||||
"""
|
||||
|
||||
fpath, fname = os.path.split(cmd)
|
||||
if fpath:
|
||||
if is_executable(cmd):
|
||||
return cmd
|
||||
|
||||
for path in os.environ['PATH'].split(os.pathsep):
|
||||
path = path.strip('"')
|
||||
exe_file = os.path.join(path, cmd)
|
||||
if is_executable(exe_file):
|
||||
return exe_file
|
||||
|
||||
return None
|
||||
|
||||
|
||||
def exec_cmd(cmd):
|
||||
"""Execute command with logging.
|
||||
Ouput of stdout and stderr will be written
|
||||
in log.
|
||||
|
||||
:param cmd: shell command
|
||||
"""
|
||||
logger.debug(u'Execute command "{0}"'.format(cmd))
|
||||
child = subprocess.Popen(
|
||||
cmd, stdout=subprocess.PIPE,
|
||||
stderr=subprocess.STDOUT,
|
||||
shell=True)
|
||||
|
||||
logger.debug(u'Stdout and stderr of command "{0}":'.format(cmd))
|
||||
for line in child.stdout:
|
||||
logger.debug(line.rstrip())
|
||||
|
||||
|
||||
child.wait()
|
||||
exit_code = child.returncode
|
||||
|
||||
if exit_code != 0:
|
||||
raise errors.ExecutedErrorNonZeroExitCode(
|
||||
u'Shell command executed with "{0}" '
|
||||
'exit code: {1} '.format(exit_code, cmd))
|
||||
|
||||
logger.debug(u'Command "{0}" successfully executed'.format(cmd))
|
2
fuel_plugin_builder/requirements.txt
Normal file
2
fuel_plugin_builder/requirements.txt
Normal file
@ -0,0 +1,2 @@
|
||||
argparse==1.2.1
|
||||
six==1.5.2
|
49
fuel_plugin_builder/setup.py
Normal file
49
fuel_plugin_builder/setup.py
Normal file
@ -0,0 +1,49 @@
|
||||
# Copyright 2014 Mirantis, 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.
|
||||
|
||||
import os
|
||||
import re
|
||||
|
||||
from setuptools import find_packages
|
||||
from setuptools import setup
|
||||
|
||||
|
||||
def find_requires():
|
||||
dir_path = os.path.dirname(os.path.realpath(__file__))
|
||||
requirements = []
|
||||
with open(u'{0}/requirements.txt'.format(dir_path), 'r') as reqs:
|
||||
requirements = reqs.readlines()
|
||||
return requirements
|
||||
|
||||
|
||||
setup(
|
||||
name='fuel_plugin_builder',
|
||||
version='0.1.0',
|
||||
description='Helps to create and build fuel plugins',
|
||||
long_description="""Helps to create and build fuel plugins""",
|
||||
classifiers=[
|
||||
"Programming Language :: Python",
|
||||
"Topic :: System :: Software Distribution"],
|
||||
author='Mirantis Inc.',
|
||||
author_email='product@mirantis.com',
|
||||
url='http://mirantis.com',
|
||||
keywords='fuel plugins plugin',
|
||||
packages=find_packages(),
|
||||
zip_safe=False,
|
||||
install_requires=find_requires(),
|
||||
include_package_data=True,
|
||||
package_data={'': ['templates/*']},
|
||||
entry_points={
|
||||
'console_scripts': [
|
||||
'fpb = fuel_plugin_builder.cli:main']})
|
6
fuel_plugin_builder/test-requirements.txt
Normal file
6
fuel_plugin_builder/test-requirements.txt
Normal file
@ -0,0 +1,6 @@
|
||||
-r requirements.txt
|
||||
hacking==0.7
|
||||
mock==1.0
|
||||
nose==1.1.2
|
||||
nose2==0.4.1
|
||||
nose-timer==0.2.0
|
38
fuel_plugin_builder/tox.ini
Normal file
38
fuel_plugin_builder/tox.ini
Normal file
@ -0,0 +1,38 @@
|
||||
[tox]
|
||||
minversion = 1.6
|
||||
skipsdist = True
|
||||
envlist = py26,py27,pep8
|
||||
|
||||
[testenv]
|
||||
usedevelop = True
|
||||
install_command = pip install {packages}
|
||||
setenv = VIRTUAL_ENV={envdir}
|
||||
deps = -r{toxinidir}/test-requirements.txt
|
||||
commands =
|
||||
nosetests {posargs:fuel_plugin}
|
||||
|
||||
[tox:jenkins]
|
||||
downloadcache = ~/cache/pip
|
||||
|
||||
[testenv:pep8]
|
||||
deps = hacking==0.7
|
||||
usedevelop = False
|
||||
commands =
|
||||
flake8 {posargs:.}
|
||||
|
||||
[testenv:venv]
|
||||
commands = {posargs:}
|
||||
|
||||
[testenv:devenv]
|
||||
envdir = devenv
|
||||
usedevelop = True
|
||||
|
||||
[flake8]
|
||||
ignore = H302,H802
|
||||
exclude = .venv,.git,.tox,dist,doc,*lib/python*,*egg,build,tools,__init__.py,docs
|
||||
show-pep8 = True
|
||||
show-source = True
|
||||
count = True
|
||||
|
||||
[hacking]
|
||||
import_exceptions = testtools.matchers
|
Loading…
Reference in New Issue
Block a user