From f905dcfd8ed0af303a4e48d9fcb6ff572cd39b22 Mon Sep 17 00:00:00 2001 From: Aurynn Shaw Date: Wed, 28 Aug 2013 14:20:18 +1200 Subject: [PATCH] Packaging-related stuff --- .gitignore | 5 +- Makefile | 38 ++++++++++ Vagrantfile | 112 ++++++++++++++++++++++++++++ packaging/scripts/post_install.sh | 12 +++ packaging/scripts/pre_install.sh | 20 +++++ requirements.txt | 3 +- sql/init.sql => scripts/__init__.py | 0 scripts/initdb.py | 25 +++++++ sources.list | 28 +++++++ vagrant/bootstrap.sh | 12 +++ 10 files changed, 253 insertions(+), 2 deletions(-) create mode 100644 Makefile create mode 100644 Vagrantfile create mode 100644 packaging/scripts/post_install.sh create mode 100644 packaging/scripts/pre_install.sh rename sql/init.sql => scripts/__init__.py (100%) create mode 100644 scripts/initdb.py create mode 100644 sources.list create mode 100644 vagrant/bootstrap.sh diff --git a/.gitignore b/.gitignore index 7e99e36..a0ae055 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,4 @@ -*.pyc \ No newline at end of file +*.pyc +*.deb +.vagrant +work \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..bf44d04 --- /dev/null +++ b/Makefile @@ -0,0 +1,38 @@ + +VERSION=0.1 +NAME=openstack-artifice +INSTALL_PATH=/opt/stack/artifice +BILLING_PROGRAM=bill.py +BINARY_PATH=/usr/local/bin + +clean: + @rm -rf ./work + @rm *.deb + +init: + @mkdir ./work/ + @mkdir -p ./work${INSTALL_PATH} + @mkdir -p ./work${BINARY_PATH} + +deb: clean init + + @cp -r ./bin ./artifice ./scripts ./README.md ./INVOICES.md \ + requirements.txt setup.py ./work/${INSTALL_PATH} + @ln -s ./work${INSTALL_PATH}/bin/${BILLING_PROGRAM} ./work${BINARY_PATH}/artifice-bill + @fpm -s dir -t deb -n ${NAME} -v ${VERSION} \ + --pre-install=packaging/scripts/pre_install.sh \ + --post-install=packaging/scripts/post_install.sh \ + --deb-pre-depends postgresql-9.2 \ + --deb-pre-depends postgresql-server-dev-9.2 \ + --deb-pre-depends postgresql-contrib-9.2 \ + --deb-pre-depends pwgen \ + --deb-pre-depends python2.7 \ + --deb-pre-depends python-pip \ + --deb-pre-depends python-dev \ + --template-scripts \ + --template-value pg_database=artifice \ + --template-value pg_user=artifice \ + --template-value pg_port=5432 \ + --template-value install_path=${INSTALL_PATH} \ + -C ./work \ + . \ No newline at end of file diff --git a/Vagrantfile b/Vagrantfile new file mode 100644 index 0000000..67bf933 --- /dev/null +++ b/Vagrantfile @@ -0,0 +1,112 @@ +# -*- mode: ruby -*- +# vi: set ft=ruby : + +Vagrant.configure("2") do |config| + # All Vagrant configuration is done here. The most common configuration + # options are documented and commented below. For a complete reference, + # please see the online documentation at vagrantup.com. + + # Every Vagrant virtual environment requires a box to build off of. + config.vm.box = "precise64" + config.vm.provision :shell, :path=>"./vagrant/bootstrap.sh" + + # The url from where the 'config.vm.box' box will be fetched if it + # doesn't already exist on the user's system. + # config.vm.box_url = "http://domain.com/path/to/above.box" + + # Create a forwarded port mapping which allows access to a specific port + # within the machine from a port on the host machine. In the example below, + # accessing "localhost:8080" will access port 80 on the guest machine. + # config.vm.network :forwarded_port, guest: 80, host: 8080 + + # Create a private network, which allows host-only access to the machine + # using a specific IP. + # config.vm.network :private_network, ip: "192.168.33.10" + + # Create a public network, which generally matched to bridged network. + # Bridged networks make the machine appear as another physical device on + # your network. + # config.vm.network :public_network + + # Share an additional folder to the guest VM. The first argument is + # the path on the host to the actual folder. The second argument is + # the path on the guest to mount the folder. And the optional third + # argument is a set of non-required options. + # config.vm.synced_folder "../data", "/vagrant_data" + + # Provider-specific configuration so you can fine-tune various + # backing providers for Vagrant. These expose provider-specific options. + # Example for VirtualBox: + # + # config.vm.provider :virtualbox do |vb| + # # Don't boot with headless mode + # vb.gui = true + # + # # Use VBoxManage to customize the VM. For example to change memory: + # vb.customize ["modifyvm", :id, "--memory", "1024"] + # end + # + # View the documentation for the provider you're using for more + # information on available options. + + # Enable provisioning with Puppet stand alone. Puppet manifests + # are contained in a directory path relative to this Vagrantfile. + # You will need to create the manifests directory and a manifest in + # the file base.pp in the manifests_path directory. + # + # An example Puppet manifest to provision the message of the day: + # + # # group { "puppet": + # # ensure => "present", + # # } + # # + # # File { owner => 0, group => 0, mode => 0644 } + # # + # # file { '/etc/motd': + # # content => "Welcome to your Vagrant-built virtual machine! + # # Managed by Puppet.\n" + # # } + # + # config.vm.provision :puppet do |puppet| + # puppet.manifests_path = "manifests" + # puppet.manifest_file = "init.pp" + # end + + # Enable provisioning with chef solo, specifying a cookbooks path, roles + # path, and data_bags path (all relative to this Vagrantfile), and adding + # some recipes and/or roles. + # + # config.vm.provision :chef_solo do |chef| + # chef.cookbooks_path = "../my-recipes/cookbooks" + # chef.roles_path = "../my-recipes/roles" + # chef.data_bags_path = "../my-recipes/data_bags" + # chef.add_recipe "mysql" + # chef.add_role "web" + # + # # You may also specify custom JSON attributes: + # chef.json = { :mysql_password => "foo" } + # end + + # Enable provisioning with chef server, specifying the chef server URL, + # and the path to the validation key (relative to this Vagrantfile). + # + # The Opscode Platform uses HTTPS. Substitute your organization for + # ORGNAME in the URL and validation key. + # + # If you have your own Chef Server, use the appropriate URL, which may be + # HTTP instead of HTTPS depending on your configuration. Also change the + # validation key to validation.pem. + # + # config.vm.provision :chef_client do |chef| + # chef.chef_server_url = "https://api.opscode.com/organizations/ORGNAME" + # chef.validation_key_path = "ORGNAME-validator.pem" + # end + # + # If you're using the Opscode platform, your validator client is + # ORGNAME-validator, replacing ORGNAME with your organization name. + # + # If you have your own Chef Server, the default validation client name is + # chef-validator, unless you changed the configuration. + # + # chef.validation_client_name = "ORGNAME-validator" +end diff --git a/packaging/scripts/post_install.sh b/packaging/scripts/post_install.sh new file mode 100644 index 0000000..7eb9f66 --- /dev/null +++ b/packaging/scripts/post_install.sh @@ -0,0 +1,12 @@ +#!/bin/sh + +PASSWORD=`cat <%= install_path %>/etc/artifice/database` + + +export DATABASE_URL="postgresql://<%= pg_user %>:$PASSWORD@localhost:<%=pg_port%>/<%=pg_database%>" + +pip install -r <%= install_path %>/requirements.txt + +python <%= install_path %>/scripts/initdb.py + +python <%= install_path%>/setup.py install # register with python! \ No newline at end of file diff --git a/packaging/scripts/pre_install.sh b/packaging/scripts/pre_install.sh new file mode 100644 index 0000000..f6b711a --- /dev/null +++ b/packaging/scripts/pre_install.sh @@ -0,0 +1,20 @@ +#!/bin/sh + +# Loads a SQL script into postgres that creates the artifice DB. +# Post-install script is going to load all the DB stuff via pythons + +PASSWORD=`pwgen -s 16` + +mkdir -p <%=install_path%>/etc/artifice +touch <%=install_path%>/etc/artifice/database +chmod 0600 <%=install_path%>/etc/artifice/database + +echo $PASSWORD >> <%= install_path %>/etc/artifice/database + +sudo -u postgres psql -d template1 <; +\c <%=pg_database%> +CREATE EXTENSION btree_gist; +CREATE USER <%=pg_user%> WITH ENCRYPTED PASSWORD '$PASSWORD'; +ALTER DATABASE <%=pg_database%> OWNER TO <%=pg_user%>; +EOF \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 46eefb5..4297f2f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ sqlalchemy>=0.8 -psycopg2>=2.5.1 \ No newline at end of file +psycopg2>=2.5.1 +requests==1.1.0 \ No newline at end of file diff --git a/sql/init.sql b/scripts/__init__.py similarity index 100% rename from sql/init.sql rename to scripts/__init__.py diff --git a/scripts/initdb.py b/scripts/initdb.py new file mode 100644 index 0000000..cd806c9 --- /dev/null +++ b/scripts/initdb.py @@ -0,0 +1,25 @@ +import sys, os + +loc = None +try: + loc, fn = os.path.split(__file__) +except NameError: + loc = os.getcwd() + + +sys.path.insert(0, os.path.abspath(os.path.join(loc +"/../artifice"))) + +from models import usage, resources, tenants, Session, Base +# string = 'postgresql://%(username)s:%(password)s@%(host)s:%(port)s/%(database)s' +# conn_string = string % {'username':'aurynn', 'host':'localhost', 'port':5433, 'password':'aurynn', 'database':'artifice'} + +from sqlalchemy import MetaData, create_engine + +import os + +engine = create_engine( os.environ["DATABASE_URL"] ) +Session.configure(bind=engine) + +s = Session() + +Base.metadata.create_all(engine) \ No newline at end of file diff --git a/sources.list b/sources.list new file mode 100644 index 0000000..9351144 --- /dev/null +++ b/sources.list @@ -0,0 +1,28 @@ +deb http://ubuntu.catalyst.net.nz/ubuntu/ precise main restricted +deb-src http://ubuntu.catalyst.net.nz/ubuntu/ precise main restricted + +deb http://ubuntu.catalyst.net.nz/ubuntu/ precise-updates main restricted +deb-src http://ubuntu.catalyst.net.nz/ubuntu/ precise-updates main restricted + +deb http://ubuntu.catalyst.net.nz/ubuntu/ precise universe +deb-src http://ubuntu.catalyst.net.nz/ubuntu/ precise universe +deb http://ubuntu.catalyst.net.nz/ubuntu/ precise-updates universe +deb-src http://ubuntu.catalyst.net.nz/ubuntu/ precise-updates universe + +deb http://ubuntu.catalyst.net.nz/ubuntu/ precise multiverse +deb-src http://ubuntu.catalyst.net.nz/ubuntu/ precise multiverse +deb http://ubuntu.catalyst.net.nz/ubuntu/ precise-updates multiverse +deb-src http://ubuntu.catalyst.net.nz/ubuntu/ precise-updates multiverse + +deb http://ubuntu.catalyst.net.nz/ubuntu/ precise-backports main restricted universe multiverse +deb-src http://ubuntu.catalyst.net.nz/ubuntu/ precise-backports main restricted universe multiverse + +deb http://security.ubuntu.com/ubuntu precise-security main restricted +deb-src http://security.ubuntu.com/ubuntu precise-security main restricted +deb http://security.ubuntu.com/ubuntu precise-security universe +deb-src http://security.ubuntu.com/ubuntu precise-security universe +deb http://security.ubuntu.com/ubuntu precise-security multiverse +deb-src http://security.ubuntu.com/ubuntu precise-security multiverse + +deb http://debian.catalyst.net.nz/catalyst stable catalyst +deb http://apt.postgresql.org/pub/repos/apt/ precise-pgdg main diff --git a/vagrant/bootstrap.sh b/vagrant/bootstrap.sh new file mode 100644 index 0000000..3a36e71 --- /dev/null +++ b/vagrant/bootstrap.sh @@ -0,0 +1,12 @@ +cp /vagrant/sources.list /etc/apt/sources.list + +wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | \ + apt-key add - + +apt-key advanced --keyserver pgp.net.nz --recv-keys 621846D9 + +aptitude update + +aptitude install gdebi-core + +gdebi -n /vagrant/openstack-artifice_0.1_amd64.deb \ No newline at end of file