diff --git a/openstack/ironic/ironic.spec.j2 b/openstack/ironic/ironic.spec.j2 new file mode 100644 index 000000000..5ea094696 --- /dev/null +++ b/openstack/ironic/ironic.spec.j2 @@ -0,0 +1,306 @@ +{% set pypi_name = 'ironic' %} +{% set source = fetch_source('https://tarballs.openstack.org/ironic/ironic-master.tar.gz') %} +{% set upstream_version = upstream_version() %} +{% set rpm_release = '1' %} +%if 0%{?rhel} || 0%{?fedora} +%global rdo 1 +%endif +Name: {{ py2name() }} +Epoch: {{ epoch('ironic') }} +Version: {{ py2rpmversion() }} +Release: {{ py2rpmrelease() }} +Summary: Openstack Provisioning of Bare Metal Servers +License: {{ license('Apache-2.0') }} +URL: https://launchpad.net/ironic +Source0: {{ source|basename }} +Source1: openstack-ironic.sudoers +Source2: openstack-ironic.logrotate +Source3: openstack-ironic.tmpfiles +Source4: openstack-ironic.defaultconf +Source5: openstack-ironic.README.config +# systemd service files +Source6: openstack-ironic-api.service +Source7: openstack-ironic-conductor.service +BuildRequires: openstack-macros +BuildRequires: {{ py3('Babel') }} +BuildRequires: {{ py3('Jinja2') }} +BuildRequires: {{ py3('SQLAlchemy') }} +BuildRequires: {{ py3('WSME') }} +BuildRequires: {{ py3('WebOb') }} +BuildRequires: {{ py3('alembic') }} +BuildRequires: {{ py3('automaton') }} +BuildRequires: {{ py3('python-cinderclient') }} +BuildRequires: {{ py3('ddt') }} +BuildRequires: {{ py3('eventlet') }} +BuildRequires: {{ py3('fixtures') }} +BuildRequires: {{ py3('futurist') }} +BuildRequires: {{ py3('python-glanceclient') }} +BuildRequires: {{ py3('ironic-lib') }} +BuildRequires: {{ py3('iso8601') }} +BuildRequires: {{ py3('jsonpatch') }} +BuildRequires: {{ py3('jsonschema') }} +BuildRequires: {{ py3('keystoneauth1') }} +BuildRequires: {{ py3('keystonemiddleware') }} +BuildRequires: {{ py3('mock') }} +BuildRequires: {{ py3('python-neutronclient') }} +BuildRequires: {{ py3('os-traits') }} +BuildRequires: {{ py3('oslo.concurrency') }} +BuildRequires: {{ py3('oslo.config') }} +BuildRequires: {{ py3('oslo.context') }} +BuildRequires: {{ py3('oslo.db') }} +BuildRequires: {{ py3('oslo.i18n') }} +BuildRequires: {{ py3('oslo.log') }} +BuildRequires: {{ py3('oslo.messaging') }} +BuildRequires: {{ py3('oslo.middleware') }} +BuildRequires: {{ py3('oslo.policy') }} +BuildRequires: {{ py3('oslo.reports') }} +BuildRequires: {{ py3('oslo.rootwrap') }} +BuildRequires: {{ py3('oslo.serialization') }} +BuildRequires: {{ py3('oslo.service') }} +BuildRequires: {{ py3('oslo.upgradecheck') }} +BuildRequires: {{ py3('oslo.utils') }} +BuildRequires: {{ py3('oslo.versionedobjects') }} +BuildRequires: {{ py3('oslotest') }} +BuildRequires: {{ py3('osprofiler') }} +BuildRequires: {{ py3('pbr') }} +BuildRequires: {{ py3('pecan') }} +BuildRequires: {{ py3('psutil') }} +BuildRequires: {{ py3('pysendfile') }} +BuildRequires: {{ py3('pytz') }} +BuildRequires: {{ py3('requests') }} +BuildRequires: {{ py3('retrying') }} +BuildRequires: {{ py3('rfc3986') }} +BuildRequires: {{ py3('six') }} +BuildRequires: {{ py3('stestr') }} +BuildRequires: {{ py3('stevedore') }} +BuildRequires: {{ py3('python-swiftclient') }} +BuildRequires: {{ py3('testtools') }} +BuildRequires: {{ py3('tooz') }} +BuildRequires: sudo +Requires: logrotate +Requires: python3-{{ pypi_name }} = %{epoch}:%{version}-%{release} +BuildArch: noarch +%if 0%{?suse_version} +BuildRequires: systemd-rpm-macros +%{?systemd_requires} +%else +BuildRequires: systemd +Requires(post): systemd +Requires(postun): systemd +Requires(pre): shadow-utils +Requires(preun): systemd +%endif + +%description +Ironic is an Incubated OpenStack project which aims to provision bare metal +machines instead of virtual machines, forked from the Nova Baremetal driver. +It is best thought of as a bare metal hypervisor API and a set of plugins +which interact with the bare metal hypervisors. By default, it will use +PXE and IPMI in concert to provision and turn on/off machines, but Ironic +also supports vendor-specific plugins which may implement additional functionality. + +%package -n python3-{{ pypi_name }} +Summary: OpenStack shared file system service (ironic) - Python module +Group: Development/Languages/Python +Requires: {{ py3('Jinja2') }} +Requires: {{ py3('SQLAlchemy') }} +Requires: {{ py3('WSME') }} +Requires: {{ py3('WebOb') }} +Requires: {{ py3('alembic') }} +Requires: {{ py3('automaton') }} +Requires: {{ py3('python-cinderclient') }} +Requires: {{ py3('eventlet') }} +Requires: {{ py3('futurist') }} +Requires: {{ py3('python-glanceclient') }} +Requires: {{ py3('ironic-lib') }} +Requires: {{ py3('jsonpatch') }} +Requires: {{ py3('jsonschema') }} +Requires: {{ py3('keystoneauth1') }} +Requires: {{ py3('keystonemiddleware') }} +Requires: {{ py3('python-neutronclient') }} +Requires: {{ py3('os-traits') }} +Requires: {{ py3('oslo.concurrency') }} +Requires: {{ py3('oslo.config') }} +Requires: {{ py3('oslo.context') }} +Requires: {{ py3('oslo.db') }} +Requires: {{ py3('oslo.i18n') }} +Requires: {{ py3('oslo.log') }} +Requires: {{ py3('oslo.messaging') }} +Requires: {{ py3('oslo.middleware') }} +Requires: {{ py3('oslo.policy') }} +Requires: {{ py3('oslo.reports') }} +Requires: {{ py3('oslo.rootwrap') }} +Requires: {{ py3('oslo.serialization') }} +Requires: {{ py3('oslo.service') }} +Requires: {{ py3('oslo.upgradecheck') }} +Requires: {{ py3('oslo.utils') }} +Requires: {{ py3('oslo.versionedobjects') }} +Requires: {{ py3('osprofiler') }} +Requires: {{ py3('pbr') }} +Requires: {{ py3('pecan') }} +Requires: {{ py3('psutil') }} +Requires: {{ py3('pysendfile') }} +Requires: {{ py3('pytz') }} +Requires: {{ py3('requests') }} +Requires: {{ py3('retrying') }} +Requires: {{ py3('rfc3986') }} +Requires: {{ py3('six') }} +Requires: {{ py3('stevedore') }} +Requires: {{ py3('python-swiftclient') }} +Requires: {{ py3('tooz') }} +Requires: sudo + +%description -n python3-{{ pypi_name }} +This package contains the core code of OpenStack Ironic. + +%package doc +Summary: OpenStack bare metal provisioning service (ironic) - Documentation +Group: Documentation/HTML +BuildRequires: {{ py3('Sphinx') }} +BuildRequires: {{ py3('openstackdocstheme') }} +BuildRequires: {{ py3('sphinxcontrib-apidoc') }} +BuildRequires: {{ py3('sphinxcontrib-httpdomain') }} +BuildRequires: {{ py3('sphinxcontrib-pecanwsme') }} +BuildRequires: {{ py3('sphinxcontrib-seqdiag') }} + +%description doc +OpenStack bare metal provisioning service. +This package contains the Documentation. + +%package api +Summary: OpenStack Ironic - API +Group: System/Management +Requires: openstack-{{ pypi_name }} = %{epoch}:%{version}-%{release} + +%description api +This package contains the OpenStack Ironic API Daemon. + +%package conductor +Summary: OpenStack Ironic - Conductor +Group: System/Management +Requires: openstack-{{ pypi_name }} = %{epoch}:%{version}-%{release} + +%description conductor +This package contains the OpenStack Ironic Conductor Manager Daemon. + +%prep +%autosetup -p1 -n {{ pypi_name }}-{{ upstream_version }} +%py_req_cleanup + +%build +%{py3_build} +PYTHONPATH=. PBR_VERSION={{ upstream_version }} %sphinx_build --keep-going -b html doc/source doc/build/html +# remove the Sphinx-build leftovers +rm -rf doc/build/html/.{doctrees,buildinfo} + +%install +%{py3_install} + +### Setup directories +install -d -m 750 %{buildroot}%{_localstatedir}/{lib,log,cache}/ironic +install -d -m 755 %{buildroot}%{_sysconfdir}/ironic +install -d -m 755 %{buildroot}%{_sysconfdir}/ironic/ironic.conf.d/ +install -d -m 700 %{buildroot}%{_localstatedir}/run/ironic + +### Install configuration files +install -D -m 644 %{SOURCE3} %{buildroot}/%_tmpfilesdir/ironic.conf +install -p -D -m 640 %{SOURCE4} %{buildroot}%{_sysconfdir}/ironic/ironic.conf.d/010-ironic.conf +mv %{buildroot}%{_prefix}%{_sysconfdir}/ironic/* %{buildroot}%{_sysconfdir}/ironic/ +cp -a etc/ironic/rootwrap.d/ %{buildroot}%{_sysconfdir}/ironic/ +install -p -D -m 640 %{SOURCE5} %{buildroot}%{_sysconfdir}/ironic/README.config + +### Install systemd service files +install -p -D -m 644 %{SOURCE6} %{buildroot}%{_unitdir}/%{name}-api.service +install -p -D -m 644 %{SOURCE7} %{buildroot}%{_unitdir}/%{name}-conductor.service + +### install symlinks on SUSE +%if 0%{?suse_version} +mkdir -p %{buildroot}%{_sbindir} +ln -s %{_sbindir}/service %{buildroot}%{_sbindir}/rc%{name}-api +ln -s %{_sbindir}/service %{buildroot}%{_sbindir}/rc%{name}-conductor +%endif + +### sudoers configuration for ironic-rootwrap: +install -D -m 440 %{SOURCE1} %{buildroot}%{_sysconfdir}/sudoers.d/openstack-ironic + +### Install logrotate +install -p -D -m 644 %{SOURCE1} %{buildroot}%{_sysconfdir}/logrotate.d/openstack-ironic + +%check +export LC_ALL=en_US.UTF-8 +python3 -m stestr.cli run + +%pre +%openstack_pre_user_group_create ironic ironic /sbin/nologin +exit 0 + +%post +%tmpfiles_create %{_tmpfilesdir}/ironic.conf + +%post api +%systemd_post %{name}-api.service + +%preun api +%systemd_preun %{name}-api.service + +%postun api +%systemd_postun %{name}-api.service + +%post conductor +%systemd_post %{name}-conductor.service + +%preun conductor +%systemd_preun %{name}-conductor.service + +%postun conductor +%systemd_postun %{name}-conductor.service + +%files +%doc README.rst +%license LICENSE +%dir %attr(0750, ironic, ironic) %{_localstatedir}/lib/ironic +%dir %attr(0750, ironic, ironic) %{_localstatedir}/cache/ironic +%dir %attr(0750, ironic, ironic) %{_localstatedir}/log/ironic +%_tmpfilesdir/ironic.conf +%dir %{_sysconfdir}/ironic +%dir %{_sysconfdir}/ironic/ironic.conf.d/ +%{_sysconfdir}/ironic/README.config +%config(noreplace) %{_sysconfdir}/logrotate.d/openstack-ironic +%config(noreplace) %{_sysconfdir}/sudoers.d/openstack-ironic +%config(noreplace) %attr(0640, root, ironic) %{_sysconfdir}/ironic/ironic.conf.d/010-ironic.conf +%config %{_sysconfdir}/ironic/rootwrap.conf +%dir %{_sysconfdir}/ironic/rootwrap.d +%config(noreplace) %{_sysconfdir}/ironic/rootwrap.d/ironic-images.filters +%config(noreplace) %{_sysconfdir}/ironic/rootwrap.d/ironic-lib.filters +%config(noreplace) %{_sysconfdir}/ironic/rootwrap.d/ironic-utils.filters +%{_bindir}/ironic-status +%{_bindir}/ironic-rootwrap +%{_bindir}/ironic-dbsync + +%files -n python3-ironic +%license LICENSE +%{python3_sitelib}/ironic/ +%{python3_sitelib}/ironic-*.egg-info + +%files doc +%license LICENSE +%doc doc/build/html + +%files api +%license LICENSE +%{_unitdir}/%{name}-api.service +%if 0%{?suse_version} +%{_sbindir}/rc%{name}-api +%endif +%{_bindir}/ironic-api +%{_bindir}/ironic-api-wsgi + +%files conductor +%license LICENSE +%{_unitdir}/%{name}-conductor.service +%if 0%{?suse_version} +%{_sbindir}/rc%{name}-conductor +%endif +%{_bindir}/ironic-conductor + +%changelog \ No newline at end of file diff --git a/openstack/ironic/openstack-ironic-api.service b/openstack/ironic/openstack-ironic-api.service new file mode 100644 index 000000000..539968533 --- /dev/null +++ b/openstack/ironic/openstack-ironic-api.service @@ -0,0 +1,16 @@ +[Unit] +Description=OpenStack Ironic - API +After=syslog.target network.target + +[Service] +Type=notify +User=ironic +Group=ironic +WorkingDirectory=/var/lib/ironic +PrivateTmp=yes +ExecStartPre=-/usr/bin/ironic-dbsync +ExecStart=/usr/bin/ironic-api +Restart=on-failure + +[Install] +WantedBy=multi-user.target diff --git a/openstack/ironic/openstack-ironic-conductor.service b/openstack/ironic/openstack-ironic-conductor.service new file mode 100644 index 000000000..2684487b3 --- /dev/null +++ b/openstack/ironic/openstack-ironic-conductor.service @@ -0,0 +1,15 @@ +[Unit] +Description=OpenStack Ironic - Conductor +After=syslog.target network.target + +[Service] +Type=notify +User=ironic +Group=ironic +WorkingDirectory=/var/lib/ironic +PrivateTmp=yes +ExecStart=/usr/bin/ironic-conductor +Restart=on-failure + +[Install] +WantedBy=multi-user.target diff --git a/openstack/ironic/openstack-ironic.README.config b/openstack/ironic/openstack-ironic.README.config new file mode 100644 index 000000000..d4733d9a0 --- /dev/null +++ b/openstack/ironic/openstack-ironic.README.config @@ -0,0 +1,30 @@ +The main service configuration (/etc/$project/$project.conf) can still be used +for configuration but the preferred way is to add config file snippets into +/etc/$project/$project.conf.d/ instead. + +As part of the packaging, the package itself installs a config snippet at +/etc/$project/$project.conf.d/010-$project.conf with basic configuration. This +file should not be modified. In case there is a need to overwrite or add +settings, a XXX-$project.conf (XXX being a 3 digit number) should be created +instead. + +Config directory file snippet naming should follow these conventions: +- snippets should start with "XXX-" where "X" is a number +- snippets must end with ".conf" +- config management systems (Crowbar, Salt, ...) should use numbers + between 100 and 499 +- users should use numbers starting from 500 + +Configuring just a single $program (eg for Nova, $project is "nova" and +$program is "nova-api", "nova-compute", "nova-scheduler", ...) can be done +in a similar way. The config snippets should be placed in +/etc/$project/$program.conf.d/ . The same snippets rules apply here, too. + +$program reads the configuration files in the following order: +- /etc/$project/$project.conf +- /etc/$project/$project.conf.d/*.conf (lexically sorted) +- /etc/$project/$program.conf.d/*.conf (lexically sorted) + +The last configured key overwrites all previous ones. In particular, settings +in /etc/$project/$project.conf are overwritten by config values from any file +in /etc/$project/$project.conf.d/XXX-$project.conf . diff --git a/openstack/ironic/openstack-ironic.defaultconf b/openstack/ironic/openstack-ironic.defaultconf new file mode 100644 index 000000000..b0cbdc5e4 --- /dev/null +++ b/openstack/ironic/openstack-ironic.defaultconf @@ -0,0 +1,7 @@ +[DEFAULT] +log_dir = /var/log/ironic +rootwrap_config = /etc/ironic/rootwrap.conf +state_path = /var/lib/ironic + +[oslo_concurrency] +lock_path = /run/ironic \ No newline at end of file diff --git a/openstack/ironic/openstack-ironic.logrotate b/openstack/ironic/openstack-ironic.logrotate new file mode 100644 index 000000000..d35b09e2e --- /dev/null +++ b/openstack/ironic/openstack-ironic.logrotate @@ -0,0 +1,10 @@ +/var/log/ironic/*.log { + compress + rotate 15 + size 1M + dateext + missingok + notifempty + su ironic ironic + sharedscripts +} diff --git a/openstack/ironic/openstack-ironic.sudoers b/openstack/ironic/openstack-ironic.sudoers new file mode 100644 index 000000000..a7e9d4968 --- /dev/null +++ b/openstack/ironic/openstack-ironic.sudoers @@ -0,0 +1,2 @@ +Defaults:ironic syslog_goodpri=none, !pam_session +ironic ALL = (root) NOPASSWD: /usr/bin/ironic-rootwrap /etc/ironic/rootwrap.conf * diff --git a/openstack/ironic/openstack-ironic.tmpfiles b/openstack/ironic/openstack-ironic.tmpfiles new file mode 100644 index 000000000..19ab51a2a --- /dev/null +++ b/openstack/ironic/openstack-ironic.tmpfiles @@ -0,0 +1 @@ +d /run/ironic 0700 ironic ironic -