diff --git a/centos_iso_image.inc b/centos_iso_image.inc index 70f5a461..1c4464f5 100644 --- a/centos_iso_image.inc +++ b/centos_iso_image.inc @@ -40,7 +40,7 @@ python2-ironicclient # python-magnumclient python2-magnumclient python-magnumclient-doc -python-magnumclient-tests +# python-magnumclient-tests # openstack-magnum python-magnum @@ -62,6 +62,8 @@ openstack-ceilometer-common openstack-ceilometer-notification openstack-ceilometer-ipmi openstack-ceilometer-polling +# ceilometerclient is needed by horizon temporarily +python2-ceilometerclient # openstack-cinder openstack-cinder @@ -147,15 +149,6 @@ distributedcloud-dcorch # distributedcloud-client distributedcloud-client-dcmanagerclient -# openstack-aodh -openstack-aodh-compat -openstack-aodh-api -openstack-aodh-evaluator -openstack-aodh-notifier -openstack-aodh-listener -openstack-aodh-expirer -openstack-aodh-config - # openstack-panko python-panko openstack-panko-api diff --git a/centos_master_docker_images.inc b/centos_master_docker_images.inc index 4da54974..be65b132 100644 --- a/centos_master_docker_images.inc +++ b/centos_master_docker_images.inc @@ -3,6 +3,7 @@ openstack/openstack-ironic openstack/openstack-magnum openstack/openstack-murano openstack/openstack-panko +openstack/python-barbican openstack/python-ceilometer openstack/python-cinder openstack/python-glance diff --git a/centos_pike_docker_images.inc b/centos_pike_docker_images.inc index 4da54974..73174fad 100644 --- a/centos_pike_docker_images.inc +++ b/centos_pike_docker_images.inc @@ -1,14 +1,14 @@ -openstack/openstack-aodh -openstack/openstack-ironic -openstack/openstack-magnum -openstack/openstack-murano -openstack/openstack-panko -openstack/python-ceilometer -openstack/python-cinder -openstack/python-glance -openstack/python-gnocchi -openstack/python-heat/openstack-heat -openstack/python-horizon -openstack/python-keystone -openstack/python-neutron -openstack/python-nova +#openstack/openstack-aodh +#openstack/openstack-ironic +#openstack/openstack-magnum +#openstack/openstack-murano +#openstack/openstack-panko +#openstack/python-ceilometer +#openstack/python-cinder +#openstack/python-glance +#openstack/python-gnocchi +#openstack/python-heat/openstack-heat +#openstack/python-horizon +#openstack/python-keystone +#openstack/python-neutron +#openstack/python-nova diff --git a/centos_pike_wheels.inc b/centos_pike_wheels.inc index d05b01be..35ccf193 100644 --- a/centos_pike_wheels.inc +++ b/centos_pike_wheels.inc @@ -13,7 +13,6 @@ openstack-murano-ui-wheels openstack-murano-wheels openstack-neutron-wheels openstack-nova-wheels -python-ceilometerclient-wheels python-cinderclient-wheels python-django-horizon-wheels python-django-openstack-auth-wheels diff --git a/centos_pkg_dirs b/centos_pkg_dirs index 2abea092..3448234d 100644 --- a/centos_pkg_dirs +++ b/centos_pkg_dirs @@ -1,5 +1,3 @@ -openstack/openstack-aodh -openstack/openstack-aodh-config openstack/openstack-murano openstack/python-muranoclient openstack/openstack-murano-ui @@ -13,8 +11,8 @@ openstack/openstack-panko openstack/openstack-panko-config openstack/openstack-os-vif openstack/python-aodhclient +openstack/python-barbicanclient openstack/python-ceilometer -openstack/python-ceilometerclient openstack/python-cinder openstack/python-cinderclient openstack/python-glance @@ -28,7 +26,6 @@ openstack/python-heatclient openstack/python-horizon openstack/python-keystone openstack/python-keystoneclient -openstack/python-keystonemiddleware openstack/python-networking-bgpvpn openstack/python-networking-sfc openstack/python-networking-odl @@ -42,11 +39,10 @@ openstack/python-openstackdocstheme openstack/python-oslo-concurrency openstack/python-oslo-service openstack/python-oslo-messaging +openstack/python-pankoclient openstack/rabbitmq-server openstack/rabbitmq-server-config -openstack/python-keystoneauth1 openstack/python-openstackclient -openstack/python-osc-lib openstack/python-openstacksdk openstack/python-django-openstack-auth openstack/python-wsme diff --git a/openstack/openstack-helm-infra/centos/build_srpm.data b/openstack/openstack-helm-infra/centos/build_srpm.data index 22d2fa85..671e561a 100644 --- a/openstack/openstack-helm-infra/centos/build_srpm.data +++ b/openstack/openstack-helm-infra/centos/build_srpm.data @@ -5,4 +5,4 @@ TAR="$TAR_NAME-$SHA.tar.gz" COPY_LIST="${CGCS_BASE}/downloads/$TAR $PKG_BASE/files/*" -TIS_PATCH_VER=7 +TIS_PATCH_VER=8 diff --git a/openstack/openstack-helm-infra/centos/openstack-helm-infra.spec b/openstack/openstack-helm-infra/centos/openstack-helm-infra.spec index 4f9ca215..97ef6ed8 100644 --- a/openstack/openstack-helm-infra/centos/openstack-helm-infra.spec +++ b/openstack/openstack-helm-infra/centos/openstack-helm-infra.spec @@ -17,10 +17,10 @@ BuildArch: noarch Patch01: 0001-gnocchi-chart-updates.patch Patch02: Mariadb-Support-adoption-of-running-single-node-mari.patch -Patch03: Mariadb-Share-container-PID-namespaces-under-docker.patch -Patch04: 0004-Allow-multiple-containers-per-daemonset-pod.patch -Patch05: fix-type-error-to-streamline-single-replica-mariadb-.patch -Patch06: Add-imagePullSecrets-in-service-account.patch +Patch03: 0004-Allow-multiple-containers-per-daemonset-pod.patch +Patch04: fix-type-error-to-streamline-single-replica-mariadb-.patch +Patch05: Add-imagePullSecrets-in-service-account.patch +Patch06: 0006-Set-Min-NGINX-handles.patch BuildRequires: helm diff --git a/openstack/openstack-helm-infra/files/0006-Set-Min-NGINX-handles.patch b/openstack/openstack-helm-infra/files/0006-Set-Min-NGINX-handles.patch new file mode 100644 index 00000000..f2f585a0 --- /dev/null +++ b/openstack/openstack-helm-infra/files/0006-Set-Min-NGINX-handles.patch @@ -0,0 +1,27 @@ +From dda42ea9d18cacb7059652e95fb1b689f175f6ac Mon Sep 17 00:00:00 2001 +From: Al Bailey +Date: Wed, 20 Feb 2019 13:56:27 -0600 +Subject: [PATCH 6/6] Set Min NGINX handles + +--- + mariadb/files/nginx.tmpl | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/mariadb/files/nginx.tmpl b/mariadb/files/nginx.tmpl +index b74b2b6..9775d89 100644 +--- a/mariadb/files/nginx.tmpl ++++ b/mariadb/files/nginx.tmpl +@@ -23,7 +23,9 @@ daemon off; + + worker_processes {{ $cfg.WorkerProcesses }}; + pid /run/nginx.pid; +-{{ if ne .MaxOpenFiles 0 }} ++{{ if lt .MaxOpenFiles 2048 }} ++worker_rlimit_nofile 2048; ++{{else}} + worker_rlimit_nofile {{ .MaxOpenFiles }}; + {{ end}} + +-- +1.8.3.1 + diff --git a/openstack/openstack-helm-infra/files/Mariadb-Share-container-PID-namespaces-under-docker.patch b/openstack/openstack-helm-infra/files/Mariadb-Share-container-PID-namespaces-under-docker.patch deleted file mode 100644 index 3be19c53..00000000 --- a/openstack/openstack-helm-infra/files/Mariadb-Share-container-PID-namespaces-under-docker.patch +++ /dev/null @@ -1,82 +0,0 @@ -From 977c523cef00f7919a82d268da7e55223f1864ce Mon Sep 17 00:00:00 2001 -From: Pete Birley -Date: Sat, 8 Dec 2018 16:16:11 -0600 -Subject: [PATCH] Mariadb: Share container PID namespaces under docker - -This PS shares pid namespaces for containers in pods under docker, -bringing running in this runtime inline with other runc based container -backends, allowing the pause process in the pod to act as a reaper. - -Change-Id: Ib5fc101d930446d848246eb5ca4d554b756cb91f -Signed-off-by: Pete Birley ---- - mariadb/templates/deployment-error.yaml | 1 + - mariadb/templates/deployment-ingress.yaml | 1 + - mariadb/templates/monitoring/prometheus/exporter-deployment.yaml | 1 + - mariadb/templates/monitoring/prometheus/exporter-job-create-user.yaml | 1 + - mariadb/templates/statefulset.yaml | 1 + - 5 files changed, 5 insertions(+) - -diff --git a/mariadb/templates/deployment-error.yaml b/mariadb/templates/deployment-error.yaml -index c310324..78c4b18 100644 ---- a/mariadb/templates/deployment-error.yaml -+++ b/mariadb/templates/deployment-error.yaml -@@ -42,6 +42,7 @@ spec: - configmap-bin-hash: {{ tuple "configmap-bin.yaml" . | include "helm-toolkit.utils.hash" }} - configmap-etc-hash: {{ tuple "configmap-etc.yaml" . | include "helm-toolkit.utils.hash" }} - spec: -+ shareProcessNamespace: true - serviceAccountName: {{ $serviceAccountName }} - affinity: - {{ tuple $envAll "mariadb" "ingress-error-pages" | include "helm-toolkit.snippets.kubernetes_pod_anti_affinity" | indent 8 }} -diff --git a/mariadb/templates/deployment-ingress.yaml b/mariadb/templates/deployment-ingress.yaml -index 053a08f..afe9407 100644 ---- a/mariadb/templates/deployment-ingress.yaml -+++ b/mariadb/templates/deployment-ingress.yaml -@@ -137,6 +137,7 @@ spec: - configmap-bin-hash: {{ tuple "configmap-bin.yaml" . | include "helm-toolkit.utils.hash" }} - configmap-etc-hash: {{ tuple "configmap-etc.yaml" . | include "helm-toolkit.utils.hash" }} - spec: -+ shareProcessNamespace: true - serviceAccountName: {{ $serviceAccountName }} - affinity: - {{ tuple $envAll "mariadb" "ingress" | include "helm-toolkit.snippets.kubernetes_pod_anti_affinity" | indent 8 }} -diff --git a/mariadb/templates/monitoring/prometheus/exporter-deployment.yaml b/mariadb/templates/monitoring/prometheus/exporter-deployment.yaml -index 274a06c..00b3f6e 100644 ---- a/mariadb/templates/monitoring/prometheus/exporter-deployment.yaml -+++ b/mariadb/templates/monitoring/prometheus/exporter-deployment.yaml -@@ -38,6 +38,7 @@ spec: - {{ tuple $envAll "prometheus_mysql_exporter" "exporter" | include "helm-toolkit.snippets.kubernetes_metadata_labels" | indent 8 }} - namespace: {{ .Values.endpoints.prometheus_mysql_exporter.namespace }} - spec: -+ shareProcessNamespace: true - serviceAccountName: {{ $serviceAccountName }} - nodeSelector: - {{ .Values.labels.prometheus_mysql_exporter.node_selector_key }}: {{ .Values.labels.prometheus_mysql_exporter.node_selector_value }} -diff --git a/mariadb/templates/monitoring/prometheus/exporter-job-create-user.yaml b/mariadb/templates/monitoring/prometheus/exporter-job-create-user.yaml -index df7a147..b9f7b56 100644 ---- a/mariadb/templates/monitoring/prometheus/exporter-job-create-user.yaml -+++ b/mariadb/templates/monitoring/prometheus/exporter-job-create-user.yaml -@@ -30,6 +30,7 @@ spec: - labels: - {{ tuple $envAll "prometheus_mysql_exporter" "create-sql-user" | include "helm-toolkit.snippets.kubernetes_metadata_labels" | indent 8 }} - spec: -+ shareProcessNamespace: true - serviceAccountName: {{ $serviceAccountName }} - restartPolicy: OnFailure - nodeSelector: -diff --git a/mariadb/templates/statefulset.yaml b/mariadb/templates/statefulset.yaml -index de0fac2..c6aa451 100644 ---- a/mariadb/templates/statefulset.yaml -+++ b/mariadb/templates/statefulset.yaml -@@ -91,6 +91,7 @@ spec: - configmap-bin-hash: {{ tuple "configmap-bin.yaml" . | include "helm-toolkit.utils.hash" }} - configmap-etc-hash: {{ tuple "configmap-etc.yaml" . | include "helm-toolkit.utils.hash" }} - spec: -+ shareProcessNamespace: true - serviceAccountName: {{ $serviceAccountName }} - affinity: - {{ tuple $envAll "mariadb" "server" | include "helm-toolkit.snippets.kubernetes_pod_anti_affinity" | indent 8 }} --- -1.8.3.1 - diff --git a/openstack/openstack-helm/centos/build_srpm.data b/openstack/openstack-helm/centos/build_srpm.data index 14cc7512..41fb015b 100644 --- a/openstack/openstack-helm/centos/build_srpm.data +++ b/openstack/openstack-helm/centos/build_srpm.data @@ -5,4 +5,4 @@ TAR="$TAR_NAME-$SHA.tar.gz" COPY_LIST="${CGCS_BASE}/downloads/$TAR $PKG_BASE/files/* " -TIS_PATCH_VER=9 +TIS_PATCH_VER=11 diff --git a/openstack/openstack-helm/centos/openstack-helm.spec b/openstack/openstack-helm/centos/openstack-helm.spec index 0f0c94d1..0cd281d6 100644 --- a/openstack/openstack-helm/centos/openstack-helm.spec +++ b/openstack/openstack-helm/centos/openstack-helm.spec @@ -25,6 +25,10 @@ Patch04: Remove-stale-Apache2-service-pids-when-a-POD-starts.patch Patch05: 0005-Add-heat-purge-deleted-cron-job.patch Patch06: 0006-Enable-cold-migration-in-nova-helm-chart.patch Patch07: 0007-Glance-chart-add-images-pool-replication.patch +Patch08: 0007-Stein-Remove-ceilometer-upgrade-option.patch +Patch09: 0008-Stein-Update-Cinder-to-include-resource_filters.json.patch +Patch10: 0009-Stein-add-log_config_append-to-neutron-etc.patch +Patch11: 0010-Stein-Nova-console-address-config-optionality.patch BuildRequires: helm BuildRequires: openstack-helm-infra @@ -42,6 +46,10 @@ Openstack Helm charts %patch05 -p1 %patch06 -p1 %patch07 -p1 +%patch08 -p1 +%patch09 -p1 +%patch10 -p1 +%patch11 -p1 %build # initialize helm and build the toolkit diff --git a/openstack/openstack-helm/files/0007-Stein-Remove-ceilometer-upgrade-option.patch b/openstack/openstack-helm/files/0007-Stein-Remove-ceilometer-upgrade-option.patch new file mode 100644 index 00000000..e035da45 --- /dev/null +++ b/openstack/openstack-helm/files/0007-Stein-Remove-ceilometer-upgrade-option.patch @@ -0,0 +1,27 @@ +From dc57c567018f8ab2c11bd7dd426cb1176d35e7db Mon Sep 17 00:00:00 2001 +From: Robert Church +Date: Fri, 11 Jan 2019 16:57:44 -0500 +Subject: [PATCH 6/8] Stein: Remove ceilometer-upgrade option + +This removes the --skip-metering-database option from _db-sync.sh.tpl. +This option was removed with the deprecated storage drivers in +Queens. + +Signed-off-by: Robert Church +--- + ceilometer/templates/bin/_db-sync.sh.tpl | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/ceilometer/templates/bin/_db-sync.sh.tpl b/ceilometer/templates/bin/_db-sync.sh.tpl +index ba7c1d84..d649654b 100644 +--- a/ceilometer/templates/bin/_db-sync.sh.tpl ++++ b/ceilometer/templates/bin/_db-sync.sh.tpl +@@ -18,4 +18,4 @@ limitations under the License. + + set -ex + +-exec ceilometer-upgrade --skip-metering-database ++exec ceilometer-upgrade +-- +2.16.5 + diff --git a/openstack/openstack-helm/files/0008-Stein-Update-Cinder-to-include-resource_filters.json.patch b/openstack/openstack-helm/files/0008-Stein-Update-Cinder-to-include-resource_filters.json.patch new file mode 100644 index 00000000..7c4b397b --- /dev/null +++ b/openstack/openstack-helm/files/0008-Stein-Update-Cinder-to-include-resource_filters.json.patch @@ -0,0 +1,99 @@ +From 26dc954e697b365ff8bca6a0f862f1053ed25648 Mon Sep 17 00:00:00 2001 +From: Robert Church +Date: Fri, 11 Jan 2019 17:23:44 -0500 +Subject: [PATCH 7/7] Stein: Update Cinder to include resource_filters.json + +During Stein the deprecated query_volume_filters config option was +removed. As a result, /etc/cinder/resource_filters.json is required to +allow volume display operations to function. + +This adds the file to the configmap and provides the default values for +the filters. + +Signed-off-by: Robert Church +--- + cinder/templates/configmap-etc.yaml | 1 + + cinder/templates/deployment-api.yaml | 4 ++++ + cinder/values.yaml | 39 ++++++++++++++++++++++++++++++++++++ + 3 files changed, 44 insertions(+) + +diff --git a/cinder/templates/configmap-etc.yaml b/cinder/templates/configmap-etc.yaml +index 88d9fa07..5ed73db6 100644 +--- a/cinder/templates/configmap-etc.yaml ++++ b/cinder/templates/configmap-etc.yaml +@@ -121,6 +121,7 @@ data: + policy.json: {{ toJson .Values.conf.policy | b64enc }} + cinder_sudoers: {{ $envAll.Values.conf.cinder_sudoers | b64enc }} + rootwrap.conf: {{ $envAll.Values.conf.rootwrap | b64enc }} ++ resource_filters.json: {{ toJson .Values.conf.resource_filters | b64enc }} + {{- range $key, $value := $envAll.Values.conf.rootwrap_filters }} + {{- $filePrefix := replace "_" "-" $key }} + {{ printf "%s.filters" $filePrefix }}: {{ $value.content | b64enc }} +diff --git a/cinder/templates/deployment-api.yaml b/cinder/templates/deployment-api.yaml +index 9213d34f..82131579 100644 +--- a/cinder/templates/deployment-api.yaml ++++ b/cinder/templates/deployment-api.yaml +@@ -109,6 +109,10 @@ spec: + mountPath: /etc/cinder/policy.json + subPath: policy.json + readOnly: true ++ - name: cinder-etc ++ mountPath: /etc/cinder/resource_filters.json ++ subPath: resource_filters.json ++ readOnly: true + {{- if eq ( split "://" .Values.conf.cinder.coordination.backend_url )._0 "file" }} + - name: cinder-coordination + mountPath: {{ ( split "://" .Values.conf.cinder.coordination.backend_url )._1 }} +diff --git a/cinder/values.yaml b/cinder/values.yaml +index cd3eb1a2..e79f8f6f 100644 +--- a/cinder/values.yaml ++++ b/cinder/values.yaml +@@ -865,6 +865,45 @@ conf: + sla: + failure_rate: + max: 0 ++ resource_filters: ++ volume: ++ - name ++ - status ++ - metadata ++ - bootable ++ - migration_status ++ - availability_zone ++ - group_id ++ backup: ++ - name ++ - status ++ - volume_id ++ snapshot: ++ - name ++ - status ++ - volume_id ++ - metadata ++ - availability_zone ++ group: [] ++ group_snapshot: ++ - status ++ - group_id ++ attachment: ++ - volume_id ++ - status ++ - instance_id ++ - attach_status ++ message: ++ - resource_uuid ++ - resource_type ++ - event_id ++ - request_id ++ - message_level ++ pool: ++ - name ++ - volume_type ++ volume_type: [] ++ + + backup: + external_ceph_rbd: +-- +2.16.5 + diff --git a/openstack/openstack-helm/files/0009-Stein-add-log_config_append-to-neutron-etc.patch b/openstack/openstack-helm/files/0009-Stein-add-log_config_append-to-neutron-etc.patch new file mode 100644 index 00000000..63fa617a --- /dev/null +++ b/openstack/openstack-helm/files/0009-Stein-add-log_config_append-to-neutron-etc.patch @@ -0,0 +1,38 @@ +From 6f72ebe170db5364287f3634359739d3f0c1c987 Mon Sep 17 00:00:00 2001 +From: Robert Church +Date: Tue, 15 Jan 2019 03:39:27 -0500 +Subject: [PATCH 8/8] Stein: add log_config_append to neutron-etc + +neutron-sanity-check command triggers privsep code and produces the +following: + +WARNING oslo.privsep.daemon [-] privsep log: +oslo_log.log.LogConfigError: Error loading logging config +/etc/neutron/logging.conf: [Errno 2] No such file or directory: +'/etc/neutron/logging.conf' + +This will allow ovs-agent to successfully deploy + +Signed-off-by: Robert Church +--- + neutron/templates/daemonset-ovs-agent.yaml | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/neutron/templates/daemonset-ovs-agent.yaml b/neutron/templates/daemonset-ovs-agent.yaml +index 34aba253..af765bd7 100644 +--- a/neutron/templates/daemonset-ovs-agent.yaml ++++ b/neutron/templates/daemonset-ovs-agent.yaml +@@ -94,6 +94,10 @@ spec: + mountPath: /etc/neutron/neutron.conf + subPath: neutron.conf + readOnly: true ++ - name: neutron-etc ++ mountPath: {{ .Values.conf.neutron.DEFAULT.log_config_append }} ++ subPath: {{ base .Values.conf.neutron.DEFAULT.log_config_append }} ++ readOnly: true + - name: neutron-etc + mountPath: /etc/neutron/plugins/ml2/ml2_conf.ini + subPath: ml2_conf.ini +-- +2.16.5 + diff --git a/openstack/openstack-helm/files/0010-Stein-Nova-console-address-config-optionality.patch b/openstack/openstack-helm/files/0010-Stein-Nova-console-address-config-optionality.patch new file mode 100644 index 00000000..7bb450d7 --- /dev/null +++ b/openstack/openstack-helm/files/0010-Stein-Nova-console-address-config-optionality.patch @@ -0,0 +1,42 @@ +From 9030eb81823e46eb374b52fec2e65fff2bb2dcf9 Mon Sep 17 00:00:00 2001 +From: Gerry Kopec +Date: Fri, 15 Feb 2019 16:15:37 -0500 +Subject: [PATCH] Stein: Nova console address config optionality + +Introduce option to nova to enable/disable the use of the vnc or spice +server proxyclient address found by the console compute init container. +This can be used to prevent the case where the found address overrides +what has already been defined in nova.conf by per host nova compute +daemonset overrides. +--- + nova/templates/bin/_nova-compute.sh.tpl | 2 ++ + nova/values.yaml | 1 + + 2 files changed, 3 insertions(+) + +diff --git a/nova/templates/bin/_nova-compute.sh.tpl b/nova/templates/bin/_nova-compute.sh.tpl +index 84596a5..b3bcca7 100644 +--- a/nova/templates/bin/_nova-compute.sh.tpl ++++ b/nova/templates/bin/_nova-compute.sh.tpl +@@ -20,5 +20,7 @@ set -ex + + exec nova-compute \ + --config-file /etc/nova/nova.conf \ ++{{- if .Values.console.address_search_enabled }} + --config-file /tmp/pod-shared/nova-console.conf \ ++{{- end }} + --config-file /tmp/pod-shared/nova-libvirt.conf +diff --git a/nova/values.yaml b/nova/values.yaml +index 9646ded..c0ec7fe 100644 +--- a/nova/values.yaml ++++ b/nova/values.yaml +@@ -438,6 +438,7 @@ console: + vncproxy: + # IF blank, search default routing interface + vncserver_proxyclient_interface: ++ address_search_enabled: true + + ssh: + key_types: +-- +1.8.3.1 + diff --git a/openstack/python-aodhclient/centos/build_srpm.data b/openstack/python-aodhclient/centos/build_srpm.data index 8aeb5536..b69c6a4e 100644 --- a/openstack/python-aodhclient/centos/build_srpm.data +++ b/openstack/python-aodhclient/centos/build_srpm.data @@ -1 +1,3 @@ -TIS_PATCH_VER=1 +TAR_NAME=aodhclient +SRC_DIR=$CGCS_BASE/git/python-aodhclient +TIS_PATCH_VER=0 diff --git a/openstack/python-aodhclient/centos/meta_patches/0001-spec.patch b/openstack/python-aodhclient/centos/meta_patches/0001-spec.patch deleted file mode 100644 index b57a41b2..00000000 --- a/openstack/python-aodhclient/centos/meta_patches/0001-spec.patch +++ /dev/null @@ -1,21 +0,0 @@ -diff --git a/SPECS/python-aodhclient.spec b/SPECS/python-aodhclient.spec -index 5d60fe2..ec5afaa 100644 ---- a/SPECS/python-aodhclient.spec -+++ b/SPECS/python-aodhclient.spec -@@ -8,13 +8,15 @@ - - Name: python-aodhclient - Version: 0.9.0 --Release: 1%{?dist} -+Release: 1%{?_tis_dist}.%{tis_patch_ver} - Summary: Python API and CLI for OpenStack Aodh - - License: ASL 2.0 - URL: https://launchpad.net/python-aodhclient - Source0: https://tarballs.openstack.org/%{name}/%{pypi_name}-%{upstream_version}.tar.gz - -+Patch0: 0001-fix-interface.patch -+ - BuildArch: noarch - - %description diff --git a/openstack/python-aodhclient/centos/meta_patches/PATCH_ORDER b/openstack/python-aodhclient/centos/meta_patches/PATCH_ORDER deleted file mode 100644 index 070ee512..00000000 --- a/openstack/python-aodhclient/centos/meta_patches/PATCH_ORDER +++ /dev/null @@ -1 +0,0 @@ -0001-spec.patch diff --git a/openstack/python-aodhclient/centos/patches/0001-fix-interface.patch b/openstack/python-aodhclient/centos/patches/0001-fix-interface.patch deleted file mode 100644 index 25597eee..00000000 --- a/openstack/python-aodhclient/centos/patches/0001-fix-interface.patch +++ /dev/null @@ -1,15 +0,0 @@ -diff --git a/aodhclient/osc.py b/aodhclient/osc.py -index 1e8599f..a1ecfee 100644 ---- a/aodhclient/osc.py -+++ b/aodhclient/osc.py -@@ -39,7 +39,9 @@ def make_client(instance): - API_VERSIONS) - # NOTE(sileht): ensure setup of the session is done - instance.setup_auth() -- return aodh_client(session=instance.session) -+ return aodh_client(session=instance.session, -+ interface=instance.interface, -+ region_name=instance.region_name) - - - def build_option_parser(parser): diff --git a/openstack/python-aodhclient/centos/python-aodhclient.spec b/openstack/python-aodhclient/centos/python-aodhclient.spec new file mode 100644 index 00000000..7b04fea1 --- /dev/null +++ b/openstack/python-aodhclient/centos/python-aodhclient.spec @@ -0,0 +1,207 @@ +%global pypi_name aodhclient + +%if 0%{?fedora} +%global with_python3 1 +%endif + +%{!?upstream_version: %global upstream_version %{version}%{?milestone}} + +%global common_desc \ +This is a client library for Aodh built on the Aodh API. It \ +provides a Python API (the aodhclient module) and a command-line tool. + +Name: python-aodhclient +Version: 1.1.1 +Release: 1%{?_tis_dist}.%{tis_patch_ver} +Summary: Python API and CLI for OpenStack Aodh + +License: ASL 2.0 +URL: https://launchpad.net/python-aodhclient +Source0: https://tarballs.openstack.org/%{name}/%{pypi_name}-%{upstream_version}.tar.gz + +BuildArch: noarch + +%description +%{common_desc} + +%package -n python2-%{pypi_name} +Summary: Python API and CLI for OpenStack Aodh +%{?python_provide:%python_provide python2-%{pypi_name}} + +BuildRequires: python-setuptools +BuildRequires: python2-pip +BuildRequires: python2-wheel +BuildRequires: python2-devel +BuildRequires: python-pbr +BuildRequires: git + +Requires: python-pbr +Requires: python-cliff >= 1.14.0 +Requires: python-oslo-i18n >= 1.5.0 +Requires: python-oslo-serialization >= 1.4.0 +Requires: python-oslo-utils >= 2.0.0 +Requires: python-keystoneauth1 >= 1.0.0 +Requires: python-six >= 1.9.0 +Requires: python-osc-lib >= 1.0.1 +Requires: pyparsing + +%description -n python2-%{pypi_name} +%{common_desc} + + +%package doc +Summary: Documentation for OpenStack Aodh API Client + +BuildRequires: python-sphinx +# FIXME: remove following line when a new release including https://review.openstack.org/#/c/476759/ is in u-c +BuildRequires: python-oslo-sphinx +BuildRequires: python-openstackdocstheme +BuildRequires: python-keystoneauth1 +BuildRequires: python-oslo-utils +BuildRequires: python-oslo-serialization +BuildRequires: python-cliff + + +%description doc +%{common_desc} +(aodh). + +This package contains auto-generated documentation. + +%package -n python2-%{pypi_name}-tests +Summary: Python API and CLI for OpenStack Aodh Tests +Requires: python2-%{pypi_name} = %{version}-%{release} + +%description -n python2-%{pypi_name}-tests +%{common_desc} + + +%if 0%{?with_python3} +%package -n python3-%{pypi_name} +Summary: Python API and CLI for OpenStack Aodh + +%{?python_provide:%python_provide python3-%{pypi_name}} + +BuildRequires: python3-setuptools +BuildRequires: python3-devel +BuildRequires: python3-pbr + +Requires: python3-pbr +Requires: python3-cliff >= 1.14.0 +Requires: python3-oslo-i18n >= 1.5.0 +Requires: python3-oslo-serialization >= 1.4.0 +Requires: python3-oslo-utils >= 2.0.0 +Requires: python3-keystoneauth1 >= 1.0.0 +Requires: python3-six >= 1.9.0 +Requires: python3-osc-lib >= 1.0.1 +Requires: python3-pyparsing + +%description -n python3-%{pypi_name} +%{common_desc} + +%package -n python3-%{pypi_name}-tests +Summary: Python API and CLI for OpenStack Aodh Tests +Requires: python3-%{pypi_name} = %{version}-%{release} + +%description -n python3-%{pypi_name}-tests +%{common_desc} + +%endif + +%prep +%autosetup -n %{pypi_name}-%{upstream_version} -S git + +# Let RPM handle the requirements +rm -f {,test-}requirements.txt + + +%build +export PBR_VERSION=%{version} +%py2_build +%py2_build_wheel +%if 0%{?with_python3} +%py3_build +%endif + +%install +export PBR_VERSION=%{version} +%if 0%{?with_python3} +%py3_install +mv %{buildroot}%{_bindir}/aodh %{buildroot}%{_bindir}/aodh-%{python3_version} +ln -s ./aodh-%{python3_version} %{buildroot}%{_bindir}/aodh-3 +%endif + +%py2_install +mv %{buildroot}%{_bindir}/aodh %{buildroot}%{_bindir}/aodh-%{python2_version} +ln -s ./aodh-%{python2_version} %{buildroot}%{_bindir}/aodh-2 + +ln -s ./aodh-2 %{buildroot}%{_bindir}/aodh + +export PYTHONPATH=. +sphinx-build -b html doc/source doc/build/html +# remove the sphinx-build leftovers +rm -rf doc/build/html/.{doctrees,buildinfo} + +# STX: stage wheels +mkdir -p $RPM_BUILD_ROOT/wheels +install -m 644 dist/*.whl $RPM_BUILD_ROOT/wheels/ + +# STX: prep SDK package +mkdir -p %{buildroot}/usr/share/remote-clients +tar zcf %{buildroot}/usr/share/remote-clients/%{pypi_name}-%{version}.tgz --exclude='.gitignore' --exclude='.gitreview' -C .. %{pypi_name}-%{version} + +%files -n python2-%{pypi_name} +%doc README.rst +%license LICENSE +%{python2_sitelib}/aodhclient +%{python2_sitelib}/*.egg-info +%{_bindir}/aodh +%{_bindir}/aodh-2 +%{_bindir}/aodh-%{python2_version} +%exclude %{python2_sitelib}/aodhclient/tests + +%files -n python2-%{pypi_name}-tests +%license LICENSE +%{python2_sitelib}/aodhclient/tests + +%if 0%{?with_python3} +%files -n python3-%{pypi_name} +%license LICENSE +%doc README.rst +%{python3_sitelib}/%{pypi_name} +%{python3_sitelib}/*.egg-info +%{_bindir}/aodh-3 +%{_bindir}/aodh-%{python3_version} +%exclude %{python3_sitelib}/aodhclient/tests + +%files -n python3-%{pypi_name}-tests +%license LICENSE +%{python3_sitelib}/aodhclient/tests +%endif + +%files doc +%doc doc/build/html +%license LICENSE + +%package sdk +Summary: SDK files for %{pypi_name} + +%description sdk +Contains SDK files for %{pypi_name} package + +%files sdk +/usr/share/remote-clients/%{pypi_name}-%{version}.tgz + +%package wheels +Summary: %{name} wheels + +%description wheels +Contains python wheels for %{name} + +%files wheels +/wheels/* + +%changelog +* Thu Aug 09 2018 RDO 1.1.1-1 +- Update to 1.1.1 + diff --git a/openstack/python-aodhclient/centos/python-aodhclient.spec.orig b/openstack/python-aodhclient/centos/python-aodhclient.spec.orig new file mode 100644 index 00000000..1057b01f --- /dev/null +++ b/openstack/python-aodhclient/centos/python-aodhclient.spec.orig @@ -0,0 +1,176 @@ +%global pypi_name aodhclient + +%if 0%{?fedora} +%global with_python3 1 +%endif + +%{!?upstream_version: %global upstream_version %{version}%{?milestone}} + +%global common_desc \ +This is a client library for Aodh built on the Aodh API. It \ +provides a Python API (the aodhclient module) and a command-line tool. + +Name: python-aodhclient +Version: 1.1.1 +Release: 1%{?dist} +Summary: Python API and CLI for OpenStack Aodh + +License: ASL 2.0 +URL: https://launchpad.net/python-aodhclient +Source0: https://tarballs.openstack.org/%{name}/%{pypi_name}-%{upstream_version}.tar.gz + +BuildArch: noarch + +%description +%{common_desc} + +%package -n python2-%{pypi_name} +Summary: Python API and CLI for OpenStack Aodh +%{?python_provide:%python_provide python2-%{pypi_name}} + +BuildRequires: python-setuptools +BuildRequires: python2-devel +BuildRequires: python-pbr +BuildRequires: git + +Requires: python-pbr +Requires: python-cliff >= 1.14.0 +Requires: python-oslo-i18n >= 1.5.0 +Requires: python-oslo-serialization >= 1.4.0 +Requires: python-oslo-utils >= 2.0.0 +Requires: python-keystoneauth1 >= 1.0.0 +Requires: python-six >= 1.9.0 +Requires: python-osc-lib >= 1.0.1 +Requires: pyparsing + +%description -n python2-%{pypi_name} +%{common_desc} + + +%package doc +Summary: Documentation for OpenStack Aodh API Client + +BuildRequires: python-sphinx +# FIXME: remove following line when a new release including https://review.openstack.org/#/c/476759/ is in u-c +BuildRequires: python-oslo-sphinx +BuildRequires: python-openstackdocstheme +BuildRequires: python-keystoneauth1 +BuildRequires: python-oslo-utils +BuildRequires: python-oslo-serialization +BuildRequires: python-cliff + + +%description doc +%{common_desc} +(aodh). + +This package contains auto-generated documentation. + +%package -n python2-%{pypi_name}-tests +Summary: Python API and CLI for OpenStack Aodh Tests +Requires: python2-%{pypi_name} = %{version}-%{release} + +%description -n python2-%{pypi_name}-tests +%{common_desc} + + +%if 0%{?with_python3} +%package -n python3-%{pypi_name} +Summary: Python API and CLI for OpenStack Aodh + +%{?python_provide:%python_provide python3-%{pypi_name}} + +BuildRequires: python3-setuptools +BuildRequires: python3-devel +BuildRequires: python3-pbr + +Requires: python3-pbr +Requires: python3-cliff >= 1.14.0 +Requires: python3-oslo-i18n >= 1.5.0 +Requires: python3-oslo-serialization >= 1.4.0 +Requires: python3-oslo-utils >= 2.0.0 +Requires: python3-keystoneauth1 >= 1.0.0 +Requires: python3-six >= 1.9.0 +Requires: python3-osc-lib >= 1.0.1 +Requires: python3-pyparsing + +%description -n python3-%{pypi_name} +%{common_desc} + +%package -n python3-%{pypi_name}-tests +Summary: Python API and CLI for OpenStack Aodh Tests +Requires: python3-%{pypi_name} = %{version}-%{release} + +%description -n python3-%{pypi_name}-tests +%{common_desc} + +%endif + +%prep +%autosetup -n %{pypi_name}-%{upstream_version} -S git + +# Let RPM handle the requirements +rm -f {,test-}requirements.txt + + +%build +%py2_build +%if 0%{?with_python3} +%py3_build +%endif + +%install +%if 0%{?with_python3} +%py3_install +mv %{buildroot}%{_bindir}/aodh %{buildroot}%{_bindir}/aodh-%{python3_version} +ln -s ./aodh-%{python3_version} %{buildroot}%{_bindir}/aodh-3 +%endif + +%py2_install +mv %{buildroot}%{_bindir}/aodh %{buildroot}%{_bindir}/aodh-%{python2_version} +ln -s ./aodh-%{python2_version} %{buildroot}%{_bindir}/aodh-2 + +ln -s ./aodh-2 %{buildroot}%{_bindir}/aodh + +export PYTHONPATH=. +sphinx-build -b html doc/source doc/build/html +# remove the sphinx-build leftovers +rm -rf doc/build/html/.{doctrees,buildinfo} + +%files -n python2-%{pypi_name} +%doc README.rst +%license LICENSE +%{python2_sitelib}/aodhclient +%{python2_sitelib}/*.egg-info +%{_bindir}/aodh +%{_bindir}/aodh-2 +%{_bindir}/aodh-%{python2_version} +%exclude %{python2_sitelib}/aodhclient/tests + +%files -n python2-%{pypi_name}-tests +%license LICENSE +%{python2_sitelib}/aodhclient/tests + +%if 0%{?with_python3} +%files -n python3-%{pypi_name} +%license LICENSE +%doc README.rst +%{python3_sitelib}/%{pypi_name} +%{python3_sitelib}/*.egg-info +%{_bindir}/aodh-3 +%{_bindir}/aodh-%{python3_version} +%exclude %{python3_sitelib}/aodhclient/tests + +%files -n python3-%{pypi_name}-tests +%license LICENSE +%{python3_sitelib}/aodhclient/tests +%endif + +%files doc +%doc doc/build/html +%license LICENSE + +%changelog +* Thu Aug 09 2018 RDO 1.1.1-1 +- Update to 1.1.1 + diff --git a/openstack/python-aodhclient/centos/srpm_path b/openstack/python-aodhclient/centos/srpm_path deleted file mode 100644 index 27c93c6d..00000000 --- a/openstack/python-aodhclient/centos/srpm_path +++ /dev/null @@ -1 +0,0 @@ -mirror:Source/python-aodhclient-0.9.0-1.el7.src.rpm diff --git a/openstack/python-barbican/centos/stx-barbican.master_docker_image b/openstack/python-barbican/centos/stx-barbican.master_docker_image new file mode 100644 index 00000000..ebb5fbd1 --- /dev/null +++ b/openstack/python-barbican/centos/stx-barbican.master_docker_image @@ -0,0 +1,6 @@ +BUILDER=loci +LABEL=stx-barbican +PROJECT=barbican +PROJECT_REPO=https://github.com/openstack/barbican.git +PIP_PACKAGES="pycrypto" +PROFILES="fluent" diff --git a/openstack/python-barbicanclient/centos/build_srpm.data b/openstack/python-barbicanclient/centos/build_srpm.data new file mode 100644 index 00000000..000289a6 --- /dev/null +++ b/openstack/python-barbicanclient/centos/build_srpm.data @@ -0,0 +1,3 @@ +TAR_NAME=python-barbicanclient +SRC_DIR=$CGCS_BASE/git/python-barbicanclient +TIS_PATCH_VER=0 diff --git a/openstack/python-barbicanclient/centos/python-barbicanclient.spec b/openstack/python-barbicanclient/centos/python-barbicanclient.spec new file mode 100644 index 00000000..ffd3b4e9 --- /dev/null +++ b/openstack/python-barbicanclient/centos/python-barbicanclient.spec @@ -0,0 +1,182 @@ +%{!?upstream_version: %global upstream_version %{version}%{?milestone}} + +%global sname barbicanclient +%if 0%{?fedora} +%global with_python3 1 +%endif + +%global common_desc \ +This is a client for the Barbican Key Management API. There is a \ +Python library for accessing the API (barbicanclient module), and \ +a command-line script (barbican). + +Name: python-barbicanclient +Version: 4.7.1 +Release: 1%{?_tis_dist}.%{tis_patch_ver} +Summary: Client Library for OpenStack Barbican Key Management API + +License: ASL 2.0 +URL: https://pypi.python.org/pypi/python-barbicanclient +Source0: https://tarballs.openstack.org/%{name}/%{name}-%{upstream_version}.tar.gz + +BuildArch: noarch + + +%description +%{common_desc} + + +%package -n python2-%{sname} +Summary: Client Library for OpenStack Barbican Key Management API + +BuildRequires: python2-devel +BuildRequires: python2-pbr +BuildRequires: python2-pip +BuildRequires: python2-wheel +BuildRequires: python2-setuptools +BuildRequires: git + +Requires: python2-requests +Requires: python2-six >= 1.10.0 +Requires: python2-oslo-i18n >= 3.15.3 +Requires: python2-oslo-serialization >= 2.18.0 +Requires: python2-oslo-utils >= 3.33.0 +Requires: python2-prettytable +Requires: python2-keystoneauth1 >= 3.4.0 +Requires: python2-pbr >= 2.0.0 +%if 0%{?fedora} > 0 +Requires: python2-cliff +%else +Requires: python-cliff +%endif + +%{?python_provide:%python_provide python2-%{sname}} + +%description -n python2-%{sname} +%{common_desc} + + +%if 0%{?with_python3} +%package -n python3-%{sname} +Summary: Client Library for OpenStack Barbican Key Management API + +BuildRequires: python3-devel +BuildRequires: python3-pbr +BuildRequires: python3-setuptools + +Requires: python3-requests +Requires: python3-six >= 1.10.0 +Requires: python3-cliff +Requires: python3-oslo-i18n >= 3.15.3 +Requires: python3-oslo-serialization >= 2.18.0 +Requires: python3-oslo-utils >= 3.33.0 +Requires: python3-prettytable +Requires: python3-keystoneauth1 >= 3.4.0 +Requires: python3-pbr >= 2.0.0 + +%{?python_provide:%python_provide python3-%{sname}} + +%description -n python3-%{sname} +%{common_desc} +%endif + + +%package doc +Summary: Documentation for OpenStack Barbican API client + +BuildRequires: python2-sphinx +BuildRequires: python2-openstackdocstheme +BuildRequires: python2-oslo-utils +BuildRequires: python2-oslo-i18n +BuildRequires: python2-prettytable + +%description doc +Documentation for the barbicanclient module + +%prep +%autosetup -n %{name}-%{upstream_version} -S git +# let RPM handle deps +sed -i '/setup_requires/d; /install_requires/d; /dependency_links/d' setup.py + +rm -rf {test-,}requirements.txt + +%build +export PBR_VERSION=%{version} +%py2_build +%py2_build_wheel +%if 0%{?with_python3} +%py3_build +%endif + +# doc +%{__python2} setup.py build_sphinx -b html +# Fix hidden-file-or-dir warnings +rm -fr doc/build/html/.buildinfo + +%install +export PBR_VERSION=%{version} +%if 0%{?with_python3} +%py3_install +mv %{buildroot}%{_bindir}/barbican %{buildroot}%{_bindir}/barbican-%{python3_version} +ln -s ./barbican-%{python3_version} %{buildroot}%{_bindir}/barbican-3 +%endif + +%py2_install +mv %{buildroot}%{_bindir}/barbican %{buildroot}%{_bindir}/barbican-%{python2_version} +ln -s ./barbican-%{python2_version} %{buildroot}%{_bindir}/barbican-2 +ln -s ./barbican-2 %{buildroot}%{_bindir}/barbican + +# STX: stage wheels +mkdir -p $RPM_BUILD_ROOT/wheels +install -m 644 dist/*.whl $RPM_BUILD_ROOT/wheels/ + +# STX: prep SDK package +mkdir -p %{buildroot}/usr/share/remote-clients +tar zcf %{buildroot}/usr/share/remote-clients/%{name}-%{version}.tgz --exclude='.gitignore' --exclude='.gitreview' -C .. %{name}-%{version} + +%files -n python2-%{sname} +%license LICENSE +%doc AUTHORS CONTRIBUTING.rst README.rst ChangeLog +%{_bindir}/barbican +%{_bindir}/barbican-2* +%{python2_sitelib}/barbicanclient +%{python2_sitelib}/python_barbicanclient-%{upstream_version}-py?.?.egg-info + +%if 0%{?with_python3} +%files -n python3-%{sname} +%license LICENSE +%doc AUTHORS CONTRIBUTING.rst README.rst ChangeLog +%{_bindir}/barbican-3* +%{python3_sitelib}/barbicanclient +%{python3_sitelib}/python_barbicanclient-%{upstream_version}-py?.?.egg-info +%endif + +%files doc +%doc doc/build/html +%license LICENSE + +%package sdk +Summary: SDK files for %{name} + +%description sdk +Contains SDK files for %{name} package + +%files sdk +/usr/share/remote-clients/%{name}-%{version}.tgz + +%package wheels +Summary: %{name} wheels + +%description wheels +Contains python wheels for %{name} + +%files wheels +/wheels/* + +%changelog +* Tue Nov 27 2018 RDO 4.7.1-1 +- Update to 4.7.1 + +* Wed Aug 08 2018 RDO 4.7.0-1 +- Update to 4.7.0 + diff --git a/openstack/python-barbicanclient/centos/python-barbicanclient.spec.orig b/openstack/python-barbicanclient/centos/python-barbicanclient.spec.orig new file mode 100644 index 00000000..5d8dcfcc --- /dev/null +++ b/openstack/python-barbicanclient/centos/python-barbicanclient.spec.orig @@ -0,0 +1,152 @@ +%{!?upstream_version: %global upstream_version %{version}%{?milestone}} + +%global sname barbicanclient +%if 0%{?fedora} +%global with_python3 1 +%endif + +%global common_desc \ +This is a client for the Barbican Key Management API. There is a \ +Python library for accessing the API (barbicanclient module), and \ +a command-line script (barbican). + +Name: python-barbicanclient +Version: 4.7.1 +Release: 1%{?dist} +Summary: Client Library for OpenStack Barbican Key Management API + +License: ASL 2.0 +URL: https://pypi.python.org/pypi/python-barbicanclient +Source0: https://tarballs.openstack.org/%{name}/%{name}-%{upstream_version}.tar.gz + +BuildArch: noarch + + +%description +%{common_desc} + + +%package -n python2-%{sname} +Summary: Client Library for OpenStack Barbican Key Management API + +BuildRequires: python2-devel +BuildRequires: python2-pbr +BuildRequires: python2-setuptools +BuildRequires: git + +Requires: python2-requests +Requires: python2-six >= 1.10.0 +Requires: python2-oslo-i18n >= 3.15.3 +Requires: python2-oslo-serialization >= 2.18.0 +Requires: python2-oslo-utils >= 3.33.0 +Requires: python2-prettytable +Requires: python2-keystoneauth1 >= 3.4.0 +Requires: python2-pbr >= 2.0.0 +%if 0%{?fedora} > 0 +Requires: python2-cliff +%else +Requires: python-cliff +%endif + +%{?python_provide:%python_provide python2-%{sname}} + +%description -n python2-%{sname} +%{common_desc} + + +%if 0%{?with_python3} +%package -n python3-%{sname} +Summary: Client Library for OpenStack Barbican Key Management API + +BuildRequires: python3-devel +BuildRequires: python3-pbr +BuildRequires: python3-setuptools + +Requires: python3-requests +Requires: python3-six >= 1.10.0 +Requires: python3-cliff +Requires: python3-oslo-i18n >= 3.15.3 +Requires: python3-oslo-serialization >= 2.18.0 +Requires: python3-oslo-utils >= 3.33.0 +Requires: python3-prettytable +Requires: python3-keystoneauth1 >= 3.4.0 +Requires: python3-pbr >= 2.0.0 + +%{?python_provide:%python_provide python3-%{sname}} + +%description -n python3-%{sname} +%{common_desc} +%endif + + +%package doc +Summary: Documentation for OpenStack Barbican API client + +BuildRequires: python2-sphinx +BuildRequires: python2-openstackdocstheme +BuildRequires: python2-oslo-utils +BuildRequires: python2-oslo-i18n +BuildRequires: python2-prettytable + +%description doc +Documentation for the barbicanclient module + +%prep +%autosetup -n %{name}-%{upstream_version} -S git +# let RPM handle deps +sed -i '/setup_requires/d; /install_requires/d; /dependency_links/d' setup.py + +rm -rf {test-,}requirements.txt + +%build +%py2_build +%if 0%{?with_python3} +%py3_build +%endif + +# doc +%{__python2} setup.py build_sphinx -b html +# Fix hidden-file-or-dir warnings +rm -fr doc/build/html/.buildinfo + +%install +%if 0%{?with_python3} +%py3_install +mv %{buildroot}%{_bindir}/barbican %{buildroot}%{_bindir}/barbican-%{python3_version} +ln -s ./barbican-%{python3_version} %{buildroot}%{_bindir}/barbican-3 +%endif + +%py2_install +mv %{buildroot}%{_bindir}/barbican %{buildroot}%{_bindir}/barbican-%{python2_version} +ln -s ./barbican-%{python2_version} %{buildroot}%{_bindir}/barbican-2 +ln -s ./barbican-2 %{buildroot}%{_bindir}/barbican + + +%files -n python2-%{sname} +%license LICENSE +%doc AUTHORS CONTRIBUTING.rst README.rst PKG-INFO ChangeLog +%{_bindir}/barbican +%{_bindir}/barbican-2* +%{python2_sitelib}/barbicanclient +%{python2_sitelib}/python_barbicanclient-%{upstream_version}-py?.?.egg-info + +%if 0%{?with_python3} +%files -n python3-%{sname} +%license LICENSE +%doc AUTHORS CONTRIBUTING.rst README.rst PKG-INFO ChangeLog +%{_bindir}/barbican-3* +%{python3_sitelib}/barbicanclient +%{python3_sitelib}/python_barbicanclient-%{upstream_version}-py?.?.egg-info +%endif + +%files doc +%doc doc/build/html +%license LICENSE + +%changelog +* Tue Nov 27 2018 RDO 4.7.1-1 +- Update to 4.7.1 + +* Wed Aug 08 2018 RDO 4.7.0-1 +- Update to 4.7.0 + diff --git a/openstack/python-ceilometerclient/centos/build_srpm.data b/openstack/python-ceilometerclient/centos/build_srpm.data deleted file mode 100644 index 5e6ea76a..00000000 --- a/openstack/python-ceilometerclient/centos/build_srpm.data +++ /dev/null @@ -1,10 +0,0 @@ -TAR_NAME=python-ceilometerclient -SRC_DIR=$CGCS_BASE/git/python-ceilometerclient - -# Tar everything found in this subdirectory. Define this if source need to be collected into a tarball in SOURCES. -# Tar file name and version are derived from PKG-INFO. Alternatively you may define TAR_NAME ad VERSION - -# A Space separated list of paths to copy to .distro/centos7/rpmbuild/SOURCES. -#COPY_LIST="$CGCS_BASE/downloads/$CLIENT_NAME-$CLIENT_VER.tar.gz $PKG_BASE/$CLIENT_NAME/*" -TIS_BASE_SRCREV=3d4966e6a76c63f6bf4a24d3cb3f86d7a585c1e0 -TIS_PATCH_VER=GITREVCOUNT diff --git a/openstack/python-ceilometerclient/centos/python-ceilometerclient.spec b/openstack/python-ceilometerclient/centos/python-ceilometerclient.spec deleted file mode 100644 index 83f25508..00000000 --- a/openstack/python-ceilometerclient/centos/python-ceilometerclient.spec +++ /dev/null @@ -1,207 +0,0 @@ -%{!?upstream_version: %global upstream_version %{version}%{?milestone}} - -%if 0%{?fedora} -%global with_python3 1 -%endif - -%global sname ceilometerclient -%global sum Python API and CLI for OpenStack Ceilometer - -Name: python-ceilometerclient -Version: 2.9.0 -Release: 1%{?_tis_dist}.%{tis_patch_ver} -Summary: %{sum} - -License: ASL 2.0 -URL: https://github.com/openstack/%{name} -Source0: %{name}-%{upstream_version}.tar.gz - -BuildArch: noarch - -BuildRequires: git -BuildRequires: python-setuptools -BuildRequires: python2-pip -BuildRequires: python2-wheel -BuildRequires: python2-devel -BuildRequires: python-pbr >= 1.6 -%if 0%{?with_python3} -BuildRequires: python3-devel -BuildRequires: python3-setuptools -BuildRequires: python3-pbr >= 1.6 -%endif - -%description -This is a client library for Ceilometer built on the Ceilometer API. It -provides a Python API (the ceilometerclient module) and a command-line tool -(ceilometer). - - -%package -n python2-%{sname} -Summary: %{sum} -# from requirements.txt -Requires: python-iso8601 -Requires: python-oslo-i18n >= 2.1.0 -Requires: python-oslo-serialization >= 1.10.0 -Requires: python-oslo-utils >= 3.17.0 -Requires: python-requests >= 2.8.1 -Requires: python-six >= 1.9.0 -Requires: python-stevedore -Requires: python-pbr -Requires: python-keystoneauth1 >= 2.1.0 -Requires: python-prettytable -%{?python_provide:%python_provide python2-%{sname}} - -%description -n python2-%{sname} -This is a client library for Ceilometer built on the Ceilometer API. It -provides a Python API (the ceilometerclient module) and a command-line tool -(ceilometer). - - -%if 0%{?with_python3} -%package -n python3-%{sname} -Summary: %{sum} -# from requirements.txt -Requires: python3-iso8601 -Requires: python3-oslo-i18n >= 2.1.0 -Requires: python3-oslo-serialization >= 1.10.0 -Requires: python3-oslo-utils >= 3.17.0 -Requires: python3-requests >= 2.8.1 -Requires: python3-six >= 1.9.0 -Requires: python3-stevedore -Requires: python3-pbr -Requires: python3-keystoneauth1 >= 2.1.0 -Requires: python3-prettytable -%{?python_provide:%python_provide python3-%{sname}} - -# WRS installs to usr/lib and not /usr/lib64 - -%description -n python3-%{sname} -This is a client library for Ceilometer built on the Ceilometer API. It -provides a Python API (the ceilometerclient module) and a command-line tool -(ceilometer). -%endif # with_python3 - - -%package doc -Summary: Documentation for OpenStack Ceilometer API Client - -BuildRequires: python-sphinx -# FIXME: remove following line when a new release including https://review.openstack.org/#/c/476759/ is in u-u -BuildRequires: python-oslo-sphinx -BuildRequires: python-openstackdocstheme - -%description doc -This is a client library for Ceilometer built on the Ceilometer API. It -provides a Python API (the ceilometerclient module) and a command-line tool -(ceilometer). - -This package contains auto-generated documentation. - - -%package sdk -Summary: SDK files for %{name} - -%description sdk -Contains SDK files for %{name} package - - -%prep -%autosetup -n %{name}-%{upstream_version} -S git - -# Remove bundled egg-info -rm -rf python_%{sname}.egg-info - -# Let RPM handle the requirements -rm -f test-requirements.txt - -%build -export PBR_VERSION=%{version} -%py2_build -%py2_build_wheel -%if 0%{?with_python3} -%py3_build -%endif - -%install -export PBR_VERSION=%{version} -%{__python2} setup.py install -O1 --skip-build --root %{buildroot} -mkdir -p $RPM_BUILD_ROOT/wheels -install -m 644 dist/*.whl $RPM_BUILD_ROOT/wheels/ - -%if 0%{?with_python3} -%{__python3} setup.py install -O1 --skip-build --root %{buildroot} -%endif - -%if 0%{?with_python3} -%py3_install -mv %{buildroot}%{_bindir}/ceilometer %{buildroot}%{_bindir}/ceilometer-%{python3_version} -ln -s ./ceilometer-%{python3_version} %{buildroot}%{_bindir}/ceilometer-3 -%endif - -%py2_install -mv %{buildroot}%{_bindir}/ceilometer %{buildroot}%{_bindir}/ceilometer-%{python2_version} -ln -s ./ceilometer-%{python2_version} %{buildroot}%{_bindir}/ceilometer-2 - -ln -s ./ceilometer-2 %{buildroot}%{_bindir}/ceilometer - -# Delete tests -rm -fr %{buildroot}%{python2_sitelib}/%{sname}/tests -%if 0%{?with_python3} -rm -fr %{buildroot}%{python3_sitelib}/%{sname}/tests -%endif - -# Build HTML docs -%{__python2} setup.py build_sphinx -b html - -# Fix hidden-file-or-dir warnings -rm -rf doc/build/html/.doctrees doc/build/html/.buildinfo - -# WRS -install -d %{buildroot}/%{_sysconfdir}/bash_completion.d -install -m 664 tools/ceilometer.bash_completion %{buildroot}/%{_sysconfdir}/bash_completion.d/ceilometer.bash_completion - -# prep SDK package -mkdir -p %{buildroot}/usr/share/remote-clients -tar zcf %{buildroot}/usr/share/remote-clients/%{name}-%{version}.tgz --exclude='.gitignore' --exclude='.gitreview' -C .. %{name}-%{version} - -%files -n python2-%{sname} -%license LICENSE -%doc README.rst -%{python2_sitelib}/%{sname} -%{python2_sitelib}/*.egg-info -%{_bindir}/ceilometer -%{_bindir}/ceilometer-2 -%{_bindir}/ceilometer-%{python2_version} -%{_sysconfdir}/bash_completion.d/ceilometer.bash_completion - -%if 0%{?with_python3} -%files -n python3-%{sname} -%license LICENSE -%doc README.rst -%{python3_sitelib}/%{sname} -%{python3_sitelib}/*.egg-info -%{_bindir}/ceilometer-3 -%{_bindir}/ceilometer-%{python3_version} -%{_sysconfdir}/bash_completion.d/ceilometer.bash_completion -%endif # with_python3 - -%files doc -%license LICENSE -%doc doc/build/html - -%files sdk -/usr/share/remote-clients/%{name}-%{version}.tgz - -%package wheels -Summary: %{name} wheels - -%description wheels -Contains python wheels for %{name} - -%files wheels -/wheels/* - -%changelog -* Fri Aug 11 2017 Alfredo Moralejo 2.9.0-1 -- Update to 2.9.0 - diff --git a/openstack/python-cinderclient/centos/build_srpm.data b/openstack/python-cinderclient/centos/build_srpm.data index 6795d701..7d37ac08 100644 --- a/openstack/python-cinderclient/centos/build_srpm.data +++ b/openstack/python-cinderclient/centos/build_srpm.data @@ -1,10 +1,3 @@ TAR_NAME=python-cinderclient SRC_DIR=$CGCS_BASE/git/python-cinderclient - -# Tar everything found in this subdirectory. Define this if source need to be collected into a tarball in SOURCES. -# Tar file name and version are derived from PKG-INFO. Alternatively you may define TAR_NAME ad VERSION - -# A Space separated list of paths to copy to .distro/centos7/rpmbuild/SOURCES. -#COPY_LIST="$CGCS_BASE/downloads/$CLIENT_NAME-$CLIENT_VER.tar.gz $PKG_BASE/$CLIENT_NAME/*" -TIS_BASE_SRCREV=3640aeab6e11987288a2f149fbeedb1c026045e2 -TIS_PATCH_VER=GITREVCOUNT +TIS_PATCH_VER=0 diff --git a/openstack/python-cinderclient/centos/python-cinderclient.spec b/openstack/python-cinderclient/centos/python-cinderclient.spec index b24968b5..3442aed9 100644 --- a/openstack/python-cinderclient/centos/python-cinderclient.spec +++ b/openstack/python-cinderclient/centos/python-cinderclient.spec @@ -5,8 +5,12 @@ %global with_python3 1 %endif +%global common_desc \ +Client library (cinderclient python module) and command line utility \ +(cinder) for interacting with OpenStack Cinder (Block Storage) API. + Name: python-cinderclient -Version: 3.1.0 +Version: 4.0.1 Release: 1%{?_tis_dist}.%{tis_patch_ver} Summary: Python API and CLI for OpenStack Cinder @@ -19,34 +23,39 @@ BuildArch: noarch BuildRequires: git %description -Client library (cinderclient python module) and command line utility -(cinder) for interacting with OpenStack Cinder (Block Storage) API. +%{common_desc} %package -n python2-%{sname} Summary: Python API and CLI for OpenStack Cinder %{?python_provide:%python_provide python2-%{sname}} BuildRequires: python2-devel -BuildRequires: python-setuptools +BuildRequires: python2-setuptools BuildRequires: python2-pip BuildRequires: python2-wheel -BuildRequires: python-pbr +BuildRequires: python2-pbr +%if 0%{?fedora} > 0 +BuildRequires: python2-d2to1 +%else BuildRequires: python-d2to1 +%endif -Requires: python-babel -Requires: python-pbr -Requires: python-prettytable -Requires: python-requests -Requires: python-setuptools +Requires: python2-babel +Requires: python2-pbr +Requires: python2-prettytable +Requires: python2-requests +Requires: python2-six +Requires: python2-keystoneauth1 >= 3.4.0 +Requires: python2-oslo-i18n >= 3.15.3 +Requires: python2-oslo-utils >= 3.33.0 +%if 0%{?fedora} > 0 +Requires: python2-simplejson +%else Requires: python-simplejson -Requires: python-six -Requires: python-keystoneauth1 >= 2.21.0 -Requires: python-oslo-i18n >= 3.9.0 -Requires: python-oslo-utils >= 3.20.0 +%endif %description -n python2-%{sname} -Client library (cinderclient python module) and command line utility -(cinder) for interacting with OpenStack Cinder (Block Storage) API. +%{common_desc} %if 0%{?with_python3} @@ -66,13 +75,12 @@ Requires: python3-requests Requires: python3-setuptools Requires: python3-simplejson Requires: python3-six -Requires: python3-keystoneauth1 >= 2.21.0 -Requires: python3-oslo-i18n >= 3.9.0 -Requires: python3-oslo-utils >= 3.20.0 +Requires: python3-keystoneauth1 >= 3.4.0 +Requires: python3-oslo-i18n >= 3.15.3 +Requires: python3-oslo-utils >= 3.33.0 %description -n python3-%{sname} -Client library (cinderclient python module) and command line utility -(cinder) for interacting with OpenStack Cinder (Block Storage) API. +%{common_desc} %endif @@ -85,16 +93,10 @@ BuildRequires: python-sphinx BuildRequires: python-openstackdocstheme %description doc -Client library (cinderclient python module) and command line utility -(cinder) for interacting with OpenStack Cinder (Block Storage) API. +%{common_desc} This package contains auto-generated documentation. -%package sdk -Summary: SDK files for %{name} - -%description sdk -Contains SDK files for %{name} package %prep %autosetup -n %{name}-%{upstream_version} -S git @@ -113,12 +115,8 @@ export PBR_VERSION=%{version} %py3_build %endif -# FIXME (amoralej): following manual edit on conf.py is required for man page -# until https://review.openstack.org/#/c/489123 is merged -sed -i 's/man\/cinder/user\/cinder/' doc/source/conf.py - -%{__python2} setup.py build_sphinx -b html -%{__python2} setup.py build_sphinx -b man +sphinx-build -W -b html doc/source doc/build/html +sphinx-build -W -b man doc/source doc/build/man # Fix hidden-file-or-dir warnings rm -fr doc/build/html/.doctrees doc/build/html/.buildinfo @@ -151,6 +149,7 @@ install -p -D -m 644 doc/build/man/cinder.1 %{buildroot}%{_mandir}/man1/cinder.1 mkdir -p %{buildroot}/usr/share/remote-clients tar zcf %{buildroot}/usr/share/remote-clients/%{name}-%{version}.tgz --exclude='.gitignore' --exclude='.gitreview' -C .. %{name}-%{version} + %files -n python2-%{sname} %doc README.rst %license LICENSE @@ -173,6 +172,12 @@ tar zcf %{buildroot}/usr/share/remote-clients/%{name}-%{version}.tgz --exclude=' %files doc %doc doc/build/html +%package sdk +Summary: SDK files for %{name} + +%description sdk +Contains SDK files for %{name} package + %files sdk /usr/share/remote-clients/%{name}-%{version}.tgz @@ -186,6 +191,6 @@ Contains python wheels for %{name} /wheels/* %changelog -* Fri Aug 11 2017 Alfredo Moralejo 3.1.0-1 -- Update to 3.1.0 +* Thu Aug 09 2018 RDO 4.0.1-1 +- Update to 4.0.1 diff --git a/openstack/python-cinderclient/centos/python-cinderclient.spec.orig b/openstack/python-cinderclient/centos/python-cinderclient.spec.orig new file mode 100644 index 00000000..b9da8b3d --- /dev/null +++ b/openstack/python-cinderclient/centos/python-cinderclient.spec.orig @@ -0,0 +1,166 @@ +%{!?upstream_version: %global upstream_version %{version}%{?milestone}} + +%global sname cinderclient +%if 0%{?fedora} +%global with_python3 1 +%endif + +%global common_desc \ +Client library (cinderclient python module) and command line utility \ +(cinder) for interacting with OpenStack Cinder (Block Storage) API. + +Name: python-cinderclient +Version: 4.0.1 +Release: 1%{?dist} +Summary: Python API and CLI for OpenStack Cinder + +License: ASL 2.0 +URL: http://github.com/openstack/python-cinderclient +Source0: https://tarballs.openstack.org/%{name}/%{name}-%{upstream_version}.tar.gz + +BuildArch: noarch + +BuildRequires: git + +%description +%{common_desc} + +%package -n python2-%{sname} +Summary: Python API and CLI for OpenStack Cinder +%{?python_provide:%python_provide python2-%{sname}} + +BuildRequires: python2-devel +BuildRequires: python2-setuptools +BuildRequires: python2-pbr +%if 0%{?fedora} > 0 +BuildRequires: python2-d2to1 +%else +BuildRequires: python-d2to1 +%endif + +Requires: python2-babel +Requires: python2-pbr +Requires: python2-prettytable +Requires: python2-requests +Requires: python2-six +Requires: python2-keystoneauth1 >= 3.4.0 +Requires: python2-oslo-i18n >= 3.15.3 +Requires: python2-oslo-utils >= 3.33.0 +%if 0%{?fedora} > 0 +Requires: python2-simplejson +%else +Requires: python-simplejson +%endif + +%description -n python2-%{sname} +%{common_desc} + + +%if 0%{?with_python3} +%package -n python3-%{sname} +Summary: Python API and CLI for OpenStack Cinder +%{?python_provide:%python_provide python3-%{sname}} + +BuildRequires: python3-devel +BuildRequires: python3-setuptools +BuildRequires: python3-pbr +BuildRequires: python3-d2to1 + +Requires: python3-babel +Requires: python3-pbr +Requires: python3-prettytable +Requires: python3-requests +Requires: python3-setuptools +Requires: python3-simplejson +Requires: python3-six +Requires: python3-keystoneauth1 >= 3.4.0 +Requires: python3-oslo-i18n >= 3.15.3 +Requires: python3-oslo-utils >= 3.33.0 + +%description -n python3-%{sname} +%{common_desc} +%endif + + +%package doc +Summary: Documentation for OpenStack Cinder API Client +Group: Documentation + +BuildRequires: python-reno +BuildRequires: python-sphinx +BuildRequires: python-openstackdocstheme + +%description doc +%{common_desc} + +This package contains auto-generated documentation. + + +%prep +%autosetup -n %{name}-%{upstream_version} -S git + +# Remove bundled egg-info +rm -rf python_cinderclient.egg-info + +# Let RPM handle the requirements +rm -f {,test-}requirements.txt + +%build +%py2_build +%if 0%{?with_python3} +%py3_build +%endif + +sphinx-build -W -b html doc/source doc/build/html +sphinx-build -W -b man doc/source doc/build/man + +# Fix hidden-file-or-dir warnings +rm -fr doc/build/html/.doctrees doc/build/html/.buildinfo + +%install +%if 0%{?with_python3} +%py3_install +mv %{buildroot}%{_bindir}/cinder %{buildroot}%{_bindir}/cinder-%{python3_version} +ln -s ./cinder-%{python3_version} %{buildroot}%{_bindir}/cinder-3 +# Delete tests +rm -fr %{buildroot}%{python3_sitelib}/cinderclient/tests +%endif + +%py2_install +mv %{buildroot}%{_bindir}/cinder %{buildroot}%{_bindir}/cinder-%{python2_version} +ln -s ./cinder-%{python2_version} %{buildroot}%{_bindir}/cinder-2 +# Delete tests +rm -fr %{buildroot}%{python2_sitelib}/cinderclient/tests + +ln -s ./cinder-2 %{buildroot}%{_bindir}/cinder + +install -p -D -m 644 tools/cinder.bash_completion %{buildroot}%{_sysconfdir}/bash_completion.d/cinder.bash_completion + +install -p -D -m 644 doc/build/man/cinder.1 %{buildroot}%{_mandir}/man1/cinder.1 + +%files -n python2-%{sname} +%doc README.rst +%license LICENSE +%{_bindir}/cinder +%{_bindir}/cinder-2* +%{python2_sitelib}/cinderclient +%{python2_sitelib}/*.egg-info +%{_sysconfdir}/bash_completion.d/cinder.bash_completion +%{_mandir}/man1/cinder.1* + +%if 0%{?with_python3} +%files -n python3-%{sname} +%doc README.rst +%license LICENSE +%{_bindir}/cinder-3* +%{python3_sitelib}/cinderclient +%{python3_sitelib}/*.egg-info +%endif + +%files doc +%doc doc/build/html + +%changelog +* Thu Aug 09 2018 RDO 4.0.1-1 +- Update to 4.0.1 + diff --git a/openstack/python-glanceclient/centos/build_srpm.data b/openstack/python-glanceclient/centos/build_srpm.data index fa24455a..de9280c0 100644 --- a/openstack/python-glanceclient/centos/build_srpm.data +++ b/openstack/python-glanceclient/centos/build_srpm.data @@ -1,5 +1,3 @@ TAR_NAME=python-glanceclient SRC_DIR="$CGCS_BASE/git/python-glanceclient" -COPY_LIST="$FILES_BASE/*" -TIS_BASE_SRCREV=13b25ff1fed908cfe7b4e719a97efd7121e3be96 -TIS_PATCH_VER=GITREVCOUNT +TIS_PATCH_VER=0 diff --git a/openstack/python-glanceclient/centos/files/image-backup.sh b/openstack/python-glanceclient/centos/files/image-backup.sh deleted file mode 100644 index ba77a0de..00000000 --- a/openstack/python-glanceclient/centos/files/image-backup.sh +++ /dev/null @@ -1,209 +0,0 @@ -#!/bin/bash -# -# Copyright (c) 2016 Wind River Systems, Inc. -# -# SPDX-License-Identifier: Apache-2.0 -# -backup_dir="/opt/backups" -tmp_dir="${backup_dir}/image_temp" - -function usage { - cat <<"EOF" -Helper tool for backing up Glance images -Usage: -image-backup export - export the image with into backup file /opt/backups/image_.tgz -image-backup import image_.tgz - import the image from the backup source file at /opt/backups/image_.tgz -into the corresponding image. - -Temporary files are stored in /opt/backups/image_temp - -Please consult the System Backups section of the Administration Guide. -EOF -} - -function create_tmp { - if [ ! -d ${backup_dir} ]; then - echo "Error: backup directory ${backup_dir} does not exist" - exit 1 - fi - # Create temporary directory - if [ ! -d ${tmp_dir} ]; then - mkdir ${tmp_dir} - fi - -} - -function remove_tmp { - # Remove temporary files and directory if not empty - local uuid=$1 - rm -f ${tmp_dir}/${uuid}* - rmdir --ignore-fail-on-non-empty ${tmp_dir} &>/dev/null -} - -function export_file_from_rbd_image { - local file=$1 - rbd export -p images ${file} ${tmp_dir}/${file} - if [ $? -ne 0 ]; then - echo "Error: Failed to export image ${file} from Ceph images pool, please check status of storage cluster" - remove_tmp; exit 1 - fi -} - -function export_image { - local uuid=$1 - - # Check if the corresponding image is present in the RBD pool - rbd -p images ls | grep -q -e "^${uuid}$" - if [ $? -ne 0 ]; then - echo "Error: Corresponding file for image with id: ${uuid} was not found in the RBD images pool" - remove_tmp; exit 1 - fi - - # Export original image - export_file_from_rbd_image ${uuid} - - # Export raw cache if present - rbd -p images ls | grep -q ${uuid}_raw - if [ $? -eq 0 ]; then - export_file_from_rbd_image ${uuid}_raw - raw="${uuid}_raw" - fi - - echo -n "Creating backup archive..." - archive="${backup_dir}/image_${uuid}.tgz" - tar czf ${archive} -C ${tmp_dir} ${uuid} ${raw} - if [ $? -ne 0 ]; then - echo "Error: Failed to create archive ${archive}" - remove_tmp; exit 1 - else - echo "done" - fi - - echo "Backup archive ${archive} created" -} - -function import_file_to_rbd_image { - local file=$1 - local snap="images/${file}@snap" - rbd import --image-format 2 ${tmp_dir}/${file} images/${file} - if [ $? -ne 0 ]; then - echo "Error: Failed to import image ${file} into Ceph images pool, please check status of storage cluster" - remove_tmp; exit 1 - fi - rbd snap create ${snap} 1>/dev/null - if [ $? -ne 0 ]; then - echo "Error: Failed to create snapshot ${snap}, please check status of storage cluster" - remove_tmp; exit 1 - fi - rbd snap protect ${snap} 1>/dev/null - if [ $? -ne 0 ]; then - echo "Error: Failed to protect snapshot ${snap}, please check status of storage cluster" - remove_tmp; exit 1 - fi -} - -function import_image { - local uuid=$1 - - # Storage cluster must be healthy before starting the import - if [ ! "$(ceph health)" = "HEALTH_OK" ]; then - echo "Error: The storage cluster health must be HEALTH_OK before proceding" - remove_tmp; exit 1 - fi - - # Check if the corresponding image is already present in the RBD pool - rbd -p images ls | grep -q -e "^${uuid}$" - if [ $? -eq 0 ]; then - echo "Error: Image with id: ${uuid} is already imported" - remove_tmp; exit 1 - fi - - # Import original image - import_file_to_rbd_image ${uuid} - - # Import raw cache - if [ -f "${tmp_dir}/${uuid}_raw" ]; then - import_file_to_rbd_image ${uuid}_raw - fi -} - -if [ $EUID -ne 0 ]; then - echo "This script must be executed as root" - exit 1 -fi - -if [ $# -ne 2 ]; then - usage - exit 0 -fi - -source /etc/nova/openrc - -# Check if glance is using ceph as RBD -cat /etc/glance/glance-api.conf | grep -q -e "^stores.*=.*rbd" -if [ $? -ne 0 ]; then - echo "Error: Glance is not configured to use the ceph backend." - echo "This command should be used only on setups with configured Ceph storage." - exit 1 -fi - -if [ "$1" = "export" ]; then - # Check that glance image is present in glance - glance image-list | tail -n +3 | awk '{print $2}' | grep -q $2 - if [ $? -ne 0 ]; then - echo "Error: Glance image with id: $2 not found. Please try with an existing image id." - remove_tmp; exit 1 - fi - - # Only allow backup of images that use rbd as backend. - glance image-show $2 | grep 'direct_url' | awk '{print $4}' | grep -q '^rbd://' - if [ $? -ne 0 ]; then - echo "Image with id: $2 is not stored in Ceph RBD. Backup using image-backup tool is not needed." - echo "Please consult the Software Management Manual for more details." - remove_tmp; exit 1 - fi - - create_tmp - export_image $2 - remove_tmp - -elif [ "$1" = "import" ]; then - # Check that the input file format is correct - if [[ ! $2 =~ ^image_.*\.tgz$ ]]; then - echo "Error: Source file name must conform to image_.tgz format" - exit 1 - fi - - # Check that the source file exists - if [ ! -f ${backup_dir}/$2 ]; then - echo "Error: File $2 does not exists in ${backup_dir}" - exit 1 - fi - - # Get glance uuid from filename - uuid=$(echo $2 | sed "s/^image_\(.*\)\.tgz/\1/g") - - # Check that glance has this image in the database - glance image-list | grep -q $uuid - if [ $? -ne 0 ]; then - echo "Error: Glance image with id: ${uuid} not found. Please try with an existing image id." - exit 1 - fi - - create_tmp - - # Extract the files that need to be imported into the temp directory - echo -n "Extracting files..." - tar xfz ${backup_dir}/$2 -C ${tmp_dir} 1>/dev/null - if [ $? -ne 0 ]; then - echo "Error: Failed to extract archive ${backup_dir}/$2 into ${tmp_dir}." - remove_tmp; exit 1 - fi - echo "done" - - # Importing images into RBD - import_image $uuid - remove_tmp -else - usage -fi diff --git a/openstack/python-glanceclient/centos/python-glanceclient.spec b/openstack/python-glanceclient/centos/python-glanceclient.spec index 1b0d5638..cd822310 100644 --- a/openstack/python-glanceclient/centos/python-glanceclient.spec +++ b/openstack/python-glanceclient/centos/python-glanceclient.spec @@ -1,31 +1,34 @@ %{!?upstream_version: %global upstream_version %{version}%{?milestone}} %global sname glanceclient +%global with_doc 0 %if 0%{?fedora} %global with_python3 1 %endif +%global common_desc \ +This is a client for the OpenStack Glance API. There's a Python API (the \ +glanceclient module), and a command-line script (glance). Each implements \ +100% of the OpenStack Glance API. + Name: python-glanceclient Epoch: 1 -Version: 2.8.0 +Version: 2.13.1 Release: 1%{?_tis_dist}.%{tis_patch_ver} Summary: Python API and CLI for OpenStack Glance License: ASL 2.0 URL: https://launchpad.net/python-glanceclient Source0: https://tarballs.openstack.org/%{name}/%{name}-%{version}.tar.gz -#WRS -Source1: image-backup.sh BuildArch: noarch BuildRequires: git +BuildRequires: openstack-macros %description -This is a client for the OpenStack Glance API. There's a Python API (the -glanceclient module), and a command-line script (glance). Each implements -100% of the OpenStack Glance API. +%{common_desc} %package -n python2-%{sname} Summary: Python API and CLI for OpenStack Glance @@ -34,24 +37,27 @@ Summary: Python API and CLI for OpenStack Glance BuildRequires: python2-devel BuildRequires: python2-pip BuildRequires: python2-wheel -BuildRequires: python-setuptools -BuildRequires: python-pbr +BuildRequires: python2-setuptools +BuildRequires: python2-pbr -Requires: python-keystoneauth1 >= 3.1.0 -Requires: python-oslo-i18n >= 2.1.0 -Requires: python-oslo-utils >= 3.20.0 -Requires: python-pbr -Requires: python-prettytable -Requires: pyOpenSSL >= 0.14 -Requires: python-requests -Requires: python-six >= 1.9.0 +Requires: python2-keystoneauth1 >= 3.6.2 +Requires: python2-oslo-i18n >= 3.15.3 +Requires: python2-oslo-utils >= 3.33.0 +Requires: python2-pbr +Requires: python2-prettytable +Requires: python2-pyOpenSSL >= 17.1.0 +Requires: python2-requests +Requires: python2-six >= 1.10.0 +%if 0%{?fedora} || 0%{?rhel} > 7 +Requires: python2-warlock +Requires: python2-wrapt +%else Requires: python-warlock Requires: python-wrapt +%endif %description -n python2-%{sname} -This is a client for the OpenStack Glance API. There's a Python API (the -glanceclient module), and a command-line script (glance). Each implements -100% of the OpenStack Glance API. +%{common_desc} %if 0%{?with_python3} %package -n python3-%{sname} @@ -62,52 +68,48 @@ BuildRequires: python3-devel BuildRequires: python3-setuptools BuildRequires: python3-pbr -Requires: python3-keystoneauth1 >= 3.1.0 -Requires: python3-oslo-i18n >= 2.1.0 -Requires: python3-oslo-utils >= 3.20.0 +Requires: python3-keystoneauth1 >= 3.6.2 +Requires: python3-oslo-i18n >= 3.15.3 +Requires: python3-oslo-utils >= 3.33.0 Requires: python3-pbr Requires: python3-prettytable -Requires: python3-pyOpenSSL >= 0.14 +Requires: python3-pyOpenSSL >= 17.1.0 Requires: python3-requests -Requires: python3-six >= 1.9.0 +Requires: python3-six >= 1.10.0 Requires: python3-warlock Requires: python3-wrapt %description -n python3-%{sname} -This is a client for the OpenStack Glance API. There's a Python API (the -glanceclient module), and a command-line script (glance). Each implements -100% of the OpenStack Glance API. +%{common_desc} %endif +%if 0%{?with_doc} %package doc Summary: Documentation for OpenStack Glance API Client -BuildRequires: python-sphinx -BuildRequires: python-openstackdocstheme -BuildRequires: python-keystoneauth1 -BuildRequires: python-oslo-utils -BuildRequires: python-prettytable +BuildRequires: python2-sphinx +BuildRequires: python2-openstackdocstheme +BuildRequires: python2-keystoneauth1 +BuildRequires: python2-oslo-utils +BuildRequires: python2-prettytable +BuildRequires: python2-pyOpenSSL >= 17.1.0 +BuildRequires: python2-sphinxcontrib-apidoc +%if 0%{?fedora} || 0%{?rhel} > 7 +BuildRequires: python2-warlock +%else BuildRequires: python-warlock -BuildRequires: pyOpenSSL >= 0.14 +%endif %description doc -This is a client for the OpenStack Glance API. There's a Python API (the -glanceclient module), and a command-line script (glance). Each implements -100% of the OpenStack Glance API. +%{common_desc} This package contains auto-generated documentation. - -%package sdk -Summary: SDK files for %{name} - -%description sdk -Contains SDK files for %{name} package - +%endif %prep %autosetup -n %{name}-%{upstream_version} -S git -rm -rf test-requirements.txt +%py_req_cleanup %build export PBR_VERSION=%{version} @@ -127,6 +129,7 @@ ln -s ./glance-%{python3_version} %{buildroot}%{_bindir}/glance-3 rm -fr %{buildroot}%{python3_sitelib}/glanceclient/tests %endif + %py2_install mv %{buildroot}%{_bindir}/glance %{buildroot}%{_bindir}/glance-%{python2_version} ln -s ./glance-%{python2_version} %{buildroot}%{_bindir}/glance-2 @@ -136,7 +139,6 @@ ln -s ./glance-2 %{buildroot}%{_bindir}/glance mkdir -p %{buildroot}%{_sysconfdir}/bash_completion.d install -pm 644 tools/glance.bash_completion \ %{buildroot}%{_sysconfdir}/bash_completion.d/glance -install -p -D -m 500 %{SOURCE1} %{buildroot}/sbin/image-backup mkdir -p $RPM_BUILD_ROOT/wheels install -m 644 dist/*.whl $RPM_BUILD_ROOT/wheels/ @@ -144,13 +146,15 @@ install -m 644 dist/*.whl $RPM_BUILD_ROOT/wheels/ # Delete tests rm -fr %{buildroot}%{python2_sitelib}/glanceclient/tests -export PYTHONPATH="$( pwd ):$PYTHONPATH" -sphinx-build -b html doc/source html - +%if 0%{?with_doc} +# generate html docs +sphinx-build -b html doc/source doc/build/html +# remove the sphinx-build leftovers +rm -rf doc/build/html/.{doctrees,buildinfo} # generate man page -sphinx-build -b man doc/source man -install -p -D -m 644 man/glance.1 %{buildroot}%{_mandir}/man1/glance.1 - +sphinx-build -b man doc/source doc/build/man +install -p -D -m 644 doc/build/man/glance.1 %{buildroot}%{_mandir}/man1/glance.1 +%endif # prep SDK package mkdir -p %{buildroot}/usr/share/remote-clients/%{name} tar zcf %{buildroot}/usr/share/remote-clients/%{name}/%{name}-%{version}.tgz --exclude='.gitignore' --exclude='.gitreview' -C .. %{name}-%{version} @@ -162,8 +166,9 @@ tar zcf %{buildroot}/usr/share/remote-clients/%{name}/%{name}-%{version}.tgz --e %{python2_sitelib}/glanceclient %{python2_sitelib}/*.egg-info %{_sysconfdir}/bash_completion.d +%if 0%{?with_doc} %{_mandir}/man1/glance.1.gz -"/sbin/image-backup" +%endif %{_bindir}/glance %{_bindir}/glance-2 %{_bindir}/glance-%{python2_version} @@ -180,9 +185,17 @@ tar zcf %{buildroot}/usr/share/remote-clients/%{name}/%{name}-%{version}.tgz --e %{_bindir}/glance-%{python3_version} %endif +%if 0%{?with_doc} %files doc -%doc html +%doc doc/build/html %license LICENSE +%endif + +%package sdk +Summary: SDK files for %{name} + +%description sdk +Contains SDK files for %{name} package %files sdk /usr/share/remote-clients/%{name}/%{name}-%{version}.tgz @@ -197,6 +210,12 @@ Contains python wheels for %{name} /wheels/* %changelog -* Fri Aug 11 2017 Alfredo Moralejo 1:2.8.0-1 -- Update to 2.8.0 +* Wed Dec 19 2018 RDO 1:2.13.1-1 +- Update to 2.13.1 + +* Mon Nov 05 2018 RDO 1:2.13.0-1 +- Update to 2.13.0 + +* Wed Aug 08 2018 RDO 1:2.12.1-1 +- Update to 2.12.1 diff --git a/openstack/python-glanceclient/centos/python-glanceclient.spec.orig b/openstack/python-glanceclient/centos/python-glanceclient.spec.orig new file mode 100644 index 00000000..d81856b8 --- /dev/null +++ b/openstack/python-glanceclient/centos/python-glanceclient.spec.orig @@ -0,0 +1,190 @@ +%{!?upstream_version: %global upstream_version %{version}%{?milestone}} + +%global sname glanceclient +%global with_doc 1 + +%if 0%{?fedora} +%global with_python3 1 +%endif + +%global common_desc \ +This is a client for the OpenStack Glance API. There's a Python API (the \ +glanceclient module), and a command-line script (glance). Each implements \ +100% of the OpenStack Glance API. + +Name: python-glanceclient +Epoch: 1 +Version: 2.13.1 +Release: 1%{?dist} +Summary: Python API and CLI for OpenStack Glance + +License: ASL 2.0 +URL: https://launchpad.net/python-glanceclient +Source0: https://tarballs.openstack.org/%{name}/%{name}-%{version}.tar.gz + +BuildArch: noarch + +BuildRequires: git +BuildRequires: openstack-macros + +%description +%{common_desc} + +%package -n python2-%{sname} +Summary: Python API and CLI for OpenStack Glance +%{?python_provide:%python_provide python2-glanceclient} + +BuildRequires: python2-devel +BuildRequires: python2-setuptools +BuildRequires: python2-pbr + +Requires: python2-keystoneauth1 >= 3.6.2 +Requires: python2-oslo-i18n >= 3.15.3 +Requires: python2-oslo-utils >= 3.33.0 +Requires: python2-pbr +Requires: python2-prettytable +Requires: python2-pyOpenSSL >= 17.1.0 +Requires: python2-requests +Requires: python2-six >= 1.10.0 +%if 0%{?fedora} || 0%{?rhel} > 7 +Requires: python2-warlock +Requires: python2-wrapt +%else +Requires: python-warlock +Requires: python-wrapt +%endif + +%description -n python2-%{sname} +%{common_desc} + +%if 0%{?with_python3} +%package -n python3-%{sname} +Summary: Python API and CLI for OpenStack Glance +%{?python_provide:%python_provide python3-glanceclient} + +BuildRequires: python3-devel +BuildRequires: python3-setuptools +BuildRequires: python3-pbr + +Requires: python3-keystoneauth1 >= 3.6.2 +Requires: python3-oslo-i18n >= 3.15.3 +Requires: python3-oslo-utils >= 3.33.0 +Requires: python3-pbr +Requires: python3-prettytable +Requires: python3-pyOpenSSL >= 17.1.0 +Requires: python3-requests +Requires: python3-six >= 1.10.0 +Requires: python3-warlock +Requires: python3-wrapt + +%description -n python3-%{sname} +%{common_desc} +%endif + +%if 0%{?with_doc} +%package doc +Summary: Documentation for OpenStack Glance API Client + +BuildRequires: python2-sphinx +BuildRequires: python2-openstackdocstheme +BuildRequires: python2-keystoneauth1 +BuildRequires: python2-oslo-utils +BuildRequires: python2-prettytable +BuildRequires: python2-pyOpenSSL >= 17.1.0 +BuildRequires: python2-sphinxcontrib-apidoc +%if 0%{?fedora} || 0%{?rhel} > 7 +BuildRequires: python2-warlock +%else +BuildRequires: python-warlock +%endif + +%description doc +%{common_desc} + +This package contains auto-generated documentation. +%endif + +%prep +%autosetup -n %{name}-%{upstream_version} -S git + +%py_req_cleanup + +%build +%py2_build +%if 0%{?with_python3} +%py3_build +%endif + +%install +%if 0%{?with_python3} +%py3_install +mv %{buildroot}%{_bindir}/glance %{buildroot}%{_bindir}/glance-%{python3_version} +ln -s ./glance-%{python3_version} %{buildroot}%{_bindir}/glance-3 +# Delete tests +rm -fr %{buildroot}%{python3_sitelib}/glanceclient/tests +%endif + +%py2_install +mv %{buildroot}%{_bindir}/glance %{buildroot}%{_bindir}/glance-%{python2_version} +ln -s ./glance-%{python2_version} %{buildroot}%{_bindir}/glance-2 + +ln -s ./glance-2 %{buildroot}%{_bindir}/glance + +mkdir -p %{buildroot}%{_sysconfdir}/bash_completion.d +install -pm 644 tools/glance.bash_completion \ + %{buildroot}%{_sysconfdir}/bash_completion.d/glance + +# Delete tests +rm -fr %{buildroot}%{python2_sitelib}/glanceclient/tests + +%if 0%{?with_doc} +# generate html docs +sphinx-build -b html doc/source doc/build/html +# remove the sphinx-build leftovers +rm -rf doc/build/html/.{doctrees,buildinfo} +# generate man page +sphinx-build -b man doc/source doc/build/man +install -p -D -m 644 doc/build/man/glance.1 %{buildroot}%{_mandir}/man1/glance.1 +%endif + +%files -n python2-%{sname} +%doc README.rst +%license LICENSE +%{python2_sitelib}/glanceclient +%{python2_sitelib}/*.egg-info +%{_sysconfdir}/bash_completion.d +%if 0%{?with_doc} +%{_mandir}/man1/glance.1.gz +%endif +%{_bindir}/glance +%{_bindir}/glance-2 +%{_bindir}/glance-%{python2_version} + +%if 0%{?with_python3} +%files -n python3-%{sname} +%license LICENSE +%doc README.rst +%{python3_sitelib}/%{sname} +%{python3_sitelib}/*.egg-info +%{_sysconfdir}/bash_completion.d +%{_mandir}/man1/glance.1.gz +%{_bindir}/glance-3 +%{_bindir}/glance-%{python3_version} +%endif + +%if 0%{?with_doc} +%files doc +%doc doc/build/html +%license LICENSE +%endif + +%changelog +* Wed Dec 19 2018 RDO 1:2.13.1-1 +- Update to 2.13.1 + +* Mon Nov 05 2018 RDO 1:2.13.0-1 +- Update to 2.13.0 + +* Wed Aug 08 2018 RDO 1:2.12.1-1 +- Update to 2.12.1 + diff --git a/openstack/python-gnocchiclient/centos/build_srpm.data b/openstack/python-gnocchiclient/centos/build_srpm.data index 83588ecd..2ac72bf0 100644 --- a/openstack/python-gnocchiclient/centos/build_srpm.data +++ b/openstack/python-gnocchiclient/centos/build_srpm.data @@ -1,5 +1,3 @@ -VERSION=7.0.1 TAR_NAME=gnocchiclient -COPY_LIST="$CGCS_BASE/downloads/$TAR_NAME-$VERSION.tar.gz" - -TIS_PATCH_VER=1 +SRC_DIR=$CGCS_BASE/git/python-gnocchiclient +TIS_PATCH_VER=0 diff --git a/openstack/python-gnocchiclient/centos/python-gnocchiclient.spec b/openstack/python-gnocchiclient/centos/python-gnocchiclient.spec index 3d90c043..ab0095e3 100644 --- a/openstack/python-gnocchiclient/centos/python-gnocchiclient.spec +++ b/openstack/python-gnocchiclient/centos/python-gnocchiclient.spec @@ -14,14 +14,17 @@ This is a client library for Gnocchi built on the Gnocchi API. It \ provides a Python API (the gnocchiclient module) and a command-line tool. Name: python-gnocchiclient -Version: 7.0.1 +Version: 7.0.4 Release: 1%{?_tis_dist}.%{tis_patch_ver} Summary: Python API and CLI for OpenStack Gnocchi License: ASL 2.0 URL: https://github.com/openstack/%{name} Source0: https://pypi.io/packages/source/g/%{pypi_name}/%{pypi_name}-%{upstream_version}.tar.gz - +# FIXME(jpena): remove this patch once a version > 7.0.1 is released +%if "%{version}" == "7.0.1" +Patch0001: 0001-Avoid-using-openstack-doc-tools.patch +%endif BuildArch: noarch @@ -37,15 +40,15 @@ BuildRequires: python2-devel BuildRequires: python2-pbr BuildRequires: python2-tools -Requires: python-cliff >= 1.16.0 -Requires: python2-osc-lib >= 1.7.0 +Requires: python2-cliff >= 2.10 +Requires: python2-osc-lib >= 1.8.0 Requires: python2-keystoneauth1 >= 2.0.0 Requires: python2-six >= 1.10.0 Requires: python2-futurist Requires: python2-ujson Requires: python2-pbr Requires: python2-iso8601 -Requires: python-dateutil +Requires: python2-dateutil Requires: python2-debtcollector %if 0%{?fedora} || 0%{?rhel} > 7 Requires: python2-monotonic @@ -62,9 +65,7 @@ Summary: Documentation for OpenStack Gnocchi API Client Group: Documentation BuildRequires: python2-sphinx -BuildRequires: python2-oslo-sphinx -BuildRequires: python2-openstack-doc-tools -BuildRequires: python-cliff +BuildRequires: python2-cliff >= 2.10 BuildRequires: python2-keystoneauth1 BuildRequires: python2-six BuildRequires: python2-futurist @@ -74,7 +75,7 @@ BuildRequires: python2-sphinx_rtd_theme BuildRequires: python2-babel # Runtime requirements needed during documentation build BuildRequires: python2-osc-lib -BuildRequires: python-dateutil +BuildRequires: python2-dateutil %description doc %{common_desc} @@ -99,8 +100,8 @@ BuildRequires: python3-pbr BuildRequires: python3-setuptools BuildRequires: python3-tools -Requires: python3-cliff >= 1.16.0 -Requires: python3-osc-lib >= 1.7.0 +Requires: python3-cliff >= 2.10 +Requires: python3-osc-lib >= 1.8.0 Requires: python3-keystoneauth1 >= 2.0.0 Requires: python3-six >= 1.10.0 Requires: python3-futurist @@ -126,14 +127,9 @@ Requires: python3-%{pypi_name} = %{version}-%{release} %description %{common_desc} -%package sdk -Summary: SDK files for %{pypi_name} - -%description sdk -Contains SDK files for %{pypi_name} package %prep -%autosetup -n %{pypi_name}-%{upstream_version} -S git +%autosetup -p1 -n %{pypi_name}-%{upstream_version} %if 0%{?with_python3} rm -rf %{py3dir} @@ -145,7 +141,7 @@ cp -a . %{py3dir} rm -rf gnocchiclient.egg-info # Let RPM handle the requirements -rm -f test-requirements.txt +rm -f {,test-}requirements.txt %build export PBR_VERSION=%{version} @@ -168,9 +164,11 @@ popd %endif %{__python2} setup.py install --skip-build --root %{buildroot} + mkdir -p $RPM_BUILD_ROOT/wheels install -m 644 dist/*.whl $RPM_BUILD_ROOT/wheels/ + # rename binaries, make compat symlinks install -m 755 -d %{buildroot}/%{_bindir} pushd %{buildroot}%{_bindir} @@ -185,7 +183,6 @@ done popd # Some env variables required to successfully build our doc -export PATH=$PATH:%{buildroot}%{_bindir} export PYTHONPATH=. export LANG=en_US.utf8 python setup.py build_sphinx -b html @@ -197,6 +194,7 @@ rm -rf doc/build/html/.doctrees doc/build/html/.buildinfo mkdir -p %{buildroot}/usr/share/remote-clients tar zcf %{buildroot}/usr/share/remote-clients/%{pypi_name}-%{version}.tgz --exclude='.gitignore' --exclude='.gitreview' -C .. %{pypi_name}-%{version} + %files -n python2-%{pypi_name} %doc README.rst %license LICENSE @@ -230,6 +228,12 @@ tar zcf %{buildroot}/usr/share/remote-clients/%{pypi_name}-%{version}.tgz --excl %files -n python-%{pypi_name}-doc %doc doc/build/html +%package sdk +Summary: SDK files for %{pypi_name} + +%description sdk +Contains SDK files for %{pypi_name} package + %files sdk /usr/share/remote-clients/%{pypi_name}-%{version}.tgz @@ -242,6 +246,8 @@ Contains python wheels for %{name} %files wheels /wheels/* + %changelog -* Tue Feb 13 2018 RDO 7.0.1-1 -- Update to 7.0.1 +* Thu Aug 09 2018 RDO 7.0.4-1 +- Update to 7.0.4 + diff --git a/openstack/python-gnocchiclient/centos/python-gnocchiclient.spec.orig b/openstack/python-gnocchiclient/centos/python-gnocchiclient.spec.orig new file mode 100644 index 00000000..5ca48cbc --- /dev/null +++ b/openstack/python-gnocchiclient/centos/python-gnocchiclient.spec.orig @@ -0,0 +1,220 @@ +%{!?python2_shortver: %global python2_shortver %(%{__python2} -c 'import sys; print(str(sys.version_info.major) + "." + str(sys.version_info.minor))')} +%{!?python3_shortver: %global python3_shortver %(%{__python3} -c 'import sys; print(str(sys.version_info.major) + "." + str(sys.version_info.minor))')} + +%global pypi_name gnocchiclient + +%{!?upstream_version: %global upstream_version %{version}%{?milestone}} + +%if 0%{?fedora} >= 24 +%global with_python3 1 +%endif + +%global common_desc \ +This is a client library for Gnocchi built on the Gnocchi API. It \ +provides a Python API (the gnocchiclient module) and a command-line tool. + +Name: python-gnocchiclient +Version: 7.0.4 +Release: 1%{?dist} +Summary: Python API and CLI for OpenStack Gnocchi + +License: ASL 2.0 +URL: https://github.com/openstack/%{name} +Source0: https://pypi.io/packages/source/g/%{pypi_name}/%{pypi_name}-%{upstream_version}.tar.gz +# FIXME(jpena): remove this patch once a version > 7.0.1 is released +%if "%{version}" == "7.0.1" +Patch0001: 0001-Avoid-using-openstack-doc-tools.patch +%endif +BuildArch: noarch + + +%package -n python2-%{pypi_name} +Summary: Python API and CLI for OpenStack Gnocchi +%{?python_provide:%python_provide python2-gnocchiclient} + + +BuildRequires: python2-setuptools +BuildRequires: python2-devel +BuildRequires: python2-pbr +BuildRequires: python2-tools + +Requires: python2-cliff >= 2.10 +Requires: python2-osc-lib >= 1.8.0 +Requires: python2-keystoneauth1 >= 2.0.0 +Requires: python2-six >= 1.10.0 +Requires: python2-futurist +Requires: python2-ujson +Requires: python2-pbr +Requires: python2-iso8601 +Requires: python2-dateutil +Requires: python2-debtcollector +%if 0%{?fedora} || 0%{?rhel} > 7 +Requires: python2-monotonic +%else +Requires: python-monotonic +%endif + +%description -n python2-%{pypi_name} +%{common_desc} + + +%package -n python-%{pypi_name}-doc +Summary: Documentation for OpenStack Gnocchi API Client +Group: Documentation + +BuildRequires: python2-sphinx +BuildRequires: python2-cliff >= 2.10 +BuildRequires: python2-keystoneauth1 +BuildRequires: python2-six +BuildRequires: python2-futurist +BuildRequires: python2-ujson +BuildRequires: python2-sphinx_rtd_theme +# test +BuildRequires: python2-babel +# Runtime requirements needed during documentation build +BuildRequires: python2-osc-lib +BuildRequires: python2-dateutil + +%description doc +%{common_desc} + +This package contains auto-generated documentation. + +%package -n python2-%{pypi_name}-tests +Summary: Python API and CLI for OpenStack Gnocchi Tests +Requires: python2-%{pypi_name} = %{version}-%{release} + +%description -n python2-%{pypi_name}-tests +%{common_desc} + +%if 0%{?with_python3} +%package -n python3-%{pypi_name} +Summary: Python API and CLI for OpenStack Gnocchi + +%{?python_provide:%python_provide python3-%{pypi_name}} + +BuildRequires: python3-devel +BuildRequires: python3-pbr +BuildRequires: python3-setuptools +BuildRequires: python3-tools + +Requires: python3-cliff >= 2.10 +Requires: python3-osc-lib >= 1.8.0 +Requires: python3-keystoneauth1 >= 2.0.0 +Requires: python3-six >= 1.10.0 +Requires: python3-futurist +Requires: python3-ujson +Requires: python3-pbr +Requires: python3-monotonic +Requires: python3-iso8601 +Requires: python3-dateutil +Requires: python3-debtcollector + +%description -n python3-%{pypi_name} +%{common_desc} + +%package -n python3-%{pypi_name}-tests +Summary: Python API and CLI for OpenStack Gnocchi Tests +Requires: python3-%{pypi_name} = %{version}-%{release} + +%description -n python3-%{pypi_name}-tests +%{common_desc} + +%endif + +%description +%{common_desc} + + +%prep +%autosetup -p1 -n %{pypi_name}-%{upstream_version} + +%if 0%{?with_python3} +rm -rf %{py3dir} +cp -a . %{py3dir} +2to3 --write --nobackups %{py3dir} +%endif + +# Remove bundled egg-info +rm -rf gnocchiclient.egg-info + +# Let RPM handle the requirements +rm -f {,test-}requirements.txt + +%build +%py2_build +%if 0%{?with_python3} +pushd %{py3dir} +LANG=en_US.UTF-8 %{__python3} setup.py build +popd +%endif + + +%install +%if 0%{?with_python3} +pushd %{py3dir} +LANG=en_US.UTF-8 %{__python3} setup.py install --skip-build --root %{buildroot} +mv %{buildroot}%{_bindir}/gnocchi %{buildroot}%{_bindir}/python3-gnocchi +popd +%endif + +%{__python2} setup.py install --skip-build --root %{buildroot} + +# rename binaries, make compat symlinks +install -m 755 -d %{buildroot}/%{_bindir} +pushd %{buildroot}%{_bindir} +for i in gnocchi-{2,%{?python2_shortver}}; do + ln -s gnocchi $i +done +%if 0%{?with_python3} +for i in gnocchi-{3,%{?python3_shortver}}; do + ln -s python3-gnocchi $i +done +%endif +popd + +# Some env variables required to successfully build our doc +export PYTHONPATH=. +export LANG=en_US.utf8 +python setup.py build_sphinx -b html + +# Fix hidden-file-or-dir warnings +rm -rf doc/build/html/.doctrees doc/build/html/.buildinfo + +%files -n python2-%{pypi_name} +%doc README.rst +%license LICENSE +%{_bindir}/gnocchi +%{_bindir}/gnocchi-2* +%{python2_sitelib}/gnocchiclient +%{python2_sitelib}/*.egg-info +%exclude %{python2_sitelib}/gnocchiclient/tests + +%files -n python2-%{pypi_name}-tests +%license LICENSE +%{python2_sitelib}/gnocchiclient/tests + + +%if 0%{?with_python3} +%files -n python3-%{pypi_name} +%doc README.rst +%license LICENSE +%{_bindir}/python3-gnocchi +%{_bindir}/gnocchi-3* +%{python3_sitelib}/gnocchiclient +%{python3_sitelib}/*.egg-info +%exclude %{python3_sitelib}/gnocchiclient/tests + +%files -n python3-%{pypi_name}-tests +%license LICENSE +%{python3_sitelib}/gnocchiclient/tests + +%endif + +%files -n python-%{pypi_name}-doc +%doc doc/build/html + +%changelog +* Thu Aug 09 2018 RDO 7.0.4-1 +- Update to 7.0.4 + diff --git a/openstack/python-heat/openstack-heat/centos/openstack-heat.spec b/openstack/python-heat/openstack-heat/centos/openstack-heat.spec index 48c42007..05619f3e 100644 --- a/openstack/python-heat/openstack-heat/centos/openstack-heat.spec +++ b/openstack/python-heat/openstack-heat/centos/openstack-heat.spec @@ -87,7 +87,6 @@ BuildRequires: python-saharaclient BuildRequires: python-neutronclient BuildRequires: python-swiftclient BuildRequires: python-heatclient -BuildRequires: python-ceilometerclient BuildRequires: python-glanceclient BuildRequires: python-troveclient BuildRequires: python-aodhclient @@ -277,7 +276,6 @@ Requires: python-oslo-service Requires: python-oslo-log Requires: python-oslo-versionedobjects -Requires: python-ceilometerclient Requires: python-cinderclient Requires: python-glanceclient Requires: python-heatclient diff --git a/openstack/python-heatclient/centos/build_srpm.data b/openstack/python-heatclient/centos/build_srpm.data index d3f64f33..a78058ee 100644 --- a/openstack/python-heatclient/centos/build_srpm.data +++ b/openstack/python-heatclient/centos/build_srpm.data @@ -1 +1,4 @@ -TIS_PATCH_VER=3 +TAR_NAME=python-heatclient +SRC_DIR=$CGCS_BASE/git/python-heatclient +TIS_PATCH_VER=0 + diff --git a/openstack/python-heatclient/centos/meta_patches/0001-Update-package-versioning-format-for-TiS-format.patch b/openstack/python-heatclient/centos/meta_patches/0001-Update-package-versioning-format-for-TiS-format.patch deleted file mode 100644 index 6c581793..00000000 --- a/openstack/python-heatclient/centos/meta_patches/0001-Update-package-versioning-format-for-TiS-format.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 001aa3b51766fb3b2cbb0c9a0c715650ef394f8c Mon Sep 17 00:00:00 2001 -From: Al Bailey -Date: Mon, 30 Jan 2017 12:24:46 -0500 -Subject: [PATCH 1/2] Update package versioning format for Titanium Cloud format - ---- - SPECS/python-heatclient.spec | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/SPECS/python-heatclient.spec b/SPECS/python-heatclient.spec -index 73a1c6f..7d6d32f 100644 ---- a/SPECS/python-heatclient.spec -+++ b/SPECS/python-heatclient.spec -@@ -8,7 +8,7 @@ - - Name: python-heatclient - Version: 1.11.1 --Release: 1%{?dist} -+Release: 1.el7%{?_tis_dist}.%{tis_patch_ver} - Summary: Python API and CLI for OpenStack Heat - - License: ASL 2.0 --- -1.8.3.1 - diff --git a/openstack/python-heatclient/centos/meta_patches/0002-Packages-sdk-for-remote-clients.patch b/openstack/python-heatclient/centos/meta_patches/0002-Packages-sdk-for-remote-clients.patch deleted file mode 100644 index 2715693b..00000000 --- a/openstack/python-heatclient/centos/meta_patches/0002-Packages-sdk-for-remote-clients.patch +++ /dev/null @@ -1,51 +0,0 @@ -From e3f1154184f24103942c98fa9373763df49703c7 Mon Sep 17 00:00:00 2001 -From: Scott Little -Date: Mon, 2 Oct 2017 14:32:49 -0400 -Subject: WRS: 0002-Packages-sdk-for-remote-clients.patch - ---- - SPECS/python-heatclient.spec | 14 ++++++++++++++ - 1 file changed, 14 insertions(+) - -diff --git a/SPECS/python-heatclient.spec b/SPECS/python-heatclient.spec -index c5ff419..1f44763 100644 ---- a/SPECS/python-heatclient.spec -+++ b/SPECS/python-heatclient.spec -@@ -92,6 +92,13 @@ the OpenStack Heat API. - - This package contains auto-generated documentation. - -+%package sdk -+Summary: SDK files for %{name} -+ -+%description sdk -+Contains SDK files for %{name} package -+ -+ - %prep - %autosetup -n %{name}-%{upstream_version} -S git - -@@ -128,6 +135,10 @@ install -pm 644 tools/heat.bash_completion \ - # Delete tests - rm -fr %{buildroot}%{python2_sitelib}/heatclient/tests - -+# prep SDK package -+mkdir -p %{buildroot}/usr/share/remote-clients/%{name} -+tar zcf %{buildroot}/usr/share/remote-clients/%{name}/%{name}-%{version}.tgz --exclude='.gitignore' --exclude='.gitreview' -C .. %{name}-%{version} -+ - - %{__python2} setup.py build_sphinx -b html - # Fix hidden-file-or-dir warnings -@@ -164,6 +175,9 @@ install -p -D -m 644 doc/build/man/heat.1 %{buildroot}%{_mandir}/man1/heat.1 - %doc doc/build/html - %license LICENSE - -+%files sdk -+/usr/share/remote-clients/%{name}/%{name}-%{version}.tgz -+ - %changelog - * Mon Oct 30 2017 rdo-trunk 1.11.1-1 - - Update to 1.11.1 --- -2.7.4 - diff --git a/openstack/python-heatclient/centos/meta_patches/0003-Apply-timezone-support-patch.patch b/openstack/python-heatclient/centos/meta_patches/0003-Apply-timezone-support-patch.patch deleted file mode 100644 index 1c73736e..00000000 --- a/openstack/python-heatclient/centos/meta_patches/0003-Apply-timezone-support-patch.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 2d0e1e8effaf3c83e137af5a79eb62f3e312bd94 Mon Sep 17 00:00:00 2001 -From: Al Bailey -Date: Thu, 26 Oct 2017 08:56:39 -0500 -Subject: [PATCH] WRS: 0003-Apply-timezone-support-patch.patch - ---- - SPECS/python-heatclient.spec | 7 +++++++ - 1 file changed, 7 insertions(+) - -diff --git a/SPECS/python-heatclient.spec b/SPECS/python-heatclient.spec -index 1f44763..12ce333 100644 ---- a/SPECS/python-heatclient.spec -+++ b/SPECS/python-heatclient.spec -@@ -15,6 +15,12 @@ License: ASL 2.0 - URL: https://launchpad.net/python-heatclientclient - Source0: https://tarballs.openstack.org/%{name}/%{name}-%{upstream_version}.tar.gz - -+# WRS. -+Patch0001: 0001-timezone-support-for-heatclient.patch -+ -+# BuildArch needs to be located below patches in the spec file -+ -+ - BuildArch: noarch - - %description -@@ -101,6 +107,7 @@ Contains SDK files for %{name} package - - %prep - %autosetup -n %{name}-%{upstream_version} -S git -+# autosetup applies all patches automatically - - rm -rf {test-,}requirements.txt tools/{pip,test}-requires - --- -1.8.3.1 - diff --git a/openstack/python-heatclient/centos/meta_patches/PATCH_ORDER b/openstack/python-heatclient/centos/meta_patches/PATCH_ORDER deleted file mode 100644 index 87f461e1..00000000 --- a/openstack/python-heatclient/centos/meta_patches/PATCH_ORDER +++ /dev/null @@ -1,3 +0,0 @@ -0001-Update-package-versioning-format-for-TiS-format.patch -0002-Packages-sdk-for-remote-clients.patch -0003-Apply-timezone-support-patch.patch diff --git a/openstack/python-heatclient/centos/patches/0001-timezone-support-for-heatclient.patch b/openstack/python-heatclient/centos/patches/0001-timezone-support-for-heatclient.patch deleted file mode 100644 index 4e85fe5e..00000000 --- a/openstack/python-heatclient/centos/patches/0001-timezone-support-for-heatclient.patch +++ /dev/null @@ -1,224 +0,0 @@ -From d144d6cfe42d8af42106f709114fd707afcfaede Mon Sep 17 00:00:00 2001 -From: Litao Gao -Date: Fri, 24 Mar 2017 04:34:54 -0400 -Subject: [PATCH 1/1] timezone support for heatclient - ---- - heatclient/common/utils.py | 48 ++++++++++++++++++++++++++++++++++++++++++++++ - heatclient/v1/shell.py | 18 +++++++++++++++++ - 2 files changed, 66 insertions(+) - -diff --git a/heatclient/common/utils.py b/heatclient/common/utils.py -index f2b20f1..9f2767f 100644 ---- a/heatclient/common/utils.py -+++ b/heatclient/common/utils.py -@@ -18,6 +18,14 @@ import logging - import os - import textwrap - import uuid -+import sys -+import re -+ -+from functools import wraps -+from cStringIO import StringIO -+from datetime import datetime -+import dateutil -+from dateutil import parser - - from oslo_serialization import jsonutils - from oslo_utils import encodeutils -@@ -447,3 +455,43 @@ def get_response_body(resp): - else: - body = None - return body -+ -+ -+def parse_date(string_data): -+ """Parses a date-like input string into a timezone aware Python -+ datetime. -+ """ -+ pattern = r'(\d{4}-\d{2}-\d{2}[T ])?\d{2}:\d{2}:\d{2}(\.\d{6})?Z?' -+ -+ def convert_date(matchobj): -+ formats = ["%Y-%m-%dT%H:%M:%S.%f", "%Y-%m-%d %H:%M:%S.%f", -+ "%Y-%m-%dT%H:%M:%S", "%Y-%m-%d %H:%M:%S", -+ "%Y-%m-%dT%H:%M:%SZ", "%H:%M:%S"] -+ datestring = matchobj.group(0) -+ if datestring: -+ for format in formats: -+ try: -+ datetime.strptime(datestring, format) -+ datestring += "+0000" -+ parsed = parser.parse(datestring) -+ converted = parsed.astimezone(dateutil.tz.tzlocal()) -+ return datetime.strftime(converted, format) -+ except Exception: -+ pass -+ return datestring -+ -+ return re.sub(pattern, convert_date, str(string_data)) -+ -+ -+def timestamp_converter(display): -+ """ -+ Decorator that parse the timestamp and convert according timezone -+ """ -+ @wraps(display) -+ def new_f(*args, **kwargs): -+ sys.stdout = mystdout = StringIO() -+ display(*args, **kwargs) -+ sys.stdout = sys.__stdout__ -+ content = mystdout.getvalue() -+ print parse_date(content) -+ return new_f -diff --git a/heatclient/v1/shell.py b/heatclient/v1/shell.py -index ac4ecb9..d8c8324 100644 ---- a/heatclient/v1/shell.py -+++ b/heatclient/v1/shell.py -@@ -43,6 +43,7 @@ def show_deprecated(deprecated, recommended): - ) - - -+@utils.timestamp_converter - @utils.arg('-f', '--template-file', metavar='', - help=_('Path to the template.')) - @utils.arg('-e', '--environment-file', metavar='', -@@ -412,6 +413,7 @@ def do_action_check(hc, args): - do_stack_list(hc) - - -+@utils.timestamp_converter - @utils.arg('id', metavar='', - help=_('Name or ID of stack to describe.')) - @utils.arg('--no-resolve-outputs', action="store_true", -@@ -590,6 +592,7 @@ def do_stack_cancel_update(hc, args): - do_stack_list(hc) - - -+@utils.timestamp_converter - @utils.arg('-s', '--show-deleted', default=False, action="store_true", - help=_('Include soft-deleted stacks in the stack listing.')) - @utils.arg('-n', '--show-nested', default=False, action="store_true", -@@ -700,6 +703,7 @@ def do_stack_list(hc, args=None): - utils.print_list(stacks, fields, sortby_index=sortby_index) - - -+@utils.timestamp_converter - @utils.arg('id', metavar='', - help=_('Name or ID of stack to query.')) - def do_output_list(hc, args): -@@ -861,6 +865,7 @@ def do_resource_type_template(hc, args): - print(utils.format_output(template)) - - -+@utils.timestamp_converter - @utils.arg('id', metavar='', - help=_('Name or ID of stack to get the template for.')) - def do_template_show(hc, args): -@@ -934,6 +939,7 @@ def do_template_validate(hc, args): - print(jsonutils.dumps(validation, indent=2, ensure_ascii=False)) - - -+@utils.timestamp_converter - @utils.arg('id', metavar='', - help=_('Name or ID of stack to show the resources for.')) - @utils.arg('-n', '--nested-depth', metavar='', -@@ -975,6 +981,7 @@ def do_resource_list(hc, args): - utils.print_list(resources, fields, sortby_index=4) - - -+@utils.timestamp_converter - @utils.arg('id', metavar='', - help=_('Name or ID of stack to show the resource for.')) - @utils.arg('resource', metavar='', -@@ -1140,6 +1147,7 @@ def do_hook_clear(hc, args): - hook_type, resource_pattern) - - -+@utils.timestamp_converter - @utils.arg('id', metavar='', - help=_('Name or ID of stack to show the events for.')) - @utils.arg('-r', '--resource', metavar='', -@@ -1263,6 +1271,7 @@ def do_event(hc, args): - do_event_show(hc, args) - - -+@utils.timestamp_converter - @utils.arg('id', metavar='', - help=_('Name or ID of stack to show the events for.')) - @utils.arg('resource', metavar='', -@@ -1290,6 +1299,7 @@ def do_event_show(hc, args): - utils.print_dict(event.to_dict(), formatters=formatters) - - -+@utils.timestamp_converter - @utils.arg('-f', '--definition-file', metavar='', - help=_('Path to JSON/YAML containing map defining ' - ', , and .')) -@@ -1360,6 +1370,7 @@ def do_config_list(hc, args): - utils.print_list(scs, fields, sortby_index=None) - - -+@utils.timestamp_converter - @utils.arg('id', metavar='', - help=_('ID of the config.')) - @utils.arg('-c', '--config-only', default=False, action="store_true", -@@ -1480,6 +1491,7 @@ def do_deployment_list(hc, args): - utils.print_list(deployments, fields, sortby_index=5) - - -+@utils.timestamp_converter - @utils.arg('id', metavar='', - help=_('ID of the deployment.')) - def do_deployment_show(hc, args): -@@ -1495,6 +1507,7 @@ def do_deployment_show(hc, args): - print(jsonutils.dumps(sd.to_dict(), indent=2)) - - -+@utils.timestamp_converter - @utils.arg('id', metavar='', - help=_('ID of the server to fetch deployments for.')) - def do_deployment_metadata_show(hc, args): -@@ -1540,6 +1553,7 @@ def do_deployment_delete(hc, args): - {'count': failure_count, 'total': len(args.id)}) - - -+@utils.timestamp_converter - @utils.arg('id', metavar='', - help=_('ID deployment to show the output for.')) - @utils.arg('output', metavar='', nargs='?', default=None, -@@ -1594,6 +1608,7 @@ def do_build_info(hc, args): - utils.print_dict(result, formatters=formatters) - - -+@utils.timestamp_converter - @utils.arg('id', metavar='', - help=_('Name or ID of stack to snapshot.')) - @utils.arg('-n', '--name', metavar='', -@@ -1613,6 +1628,7 @@ def do_stack_snapshot(hc, args): - print(jsonutils.dumps(snapshot, indent=2, ensure_ascii=False)) - - -+@utils.timestamp_converter - @utils.arg('id', metavar='', - help=_('Name or ID of the stack containing the snapshot.')) - @utils.arg('snapshot', metavar='', -@@ -1681,6 +1697,7 @@ def do_stack_restore(hc, args): - raise exc.CommandError(_('Stack or snapshot not found')) - - -+@utils.timestamp_converter - @utils.arg('id', metavar='', - help=_('Name or ID of the stack containing the snapshots.')) - def do_snapshot_list(hc, args): -@@ -1704,6 +1721,7 @@ def do_snapshot_list(hc, args): - utils.print_list(snapshots["snapshots"], fields, formatters=formatters) - - -+@utils.timestamp_converter - def do_service_list(hc, args=None): - '''List the Heat engines.''' - show_deprecated('heat service-list', --- -1.8.3.1 - diff --git a/openstack/python-heatclient/centos/python-heatclient.spec b/openstack/python-heatclient/centos/python-heatclient.spec new file mode 100644 index 00000000..dd4e30a1 --- /dev/null +++ b/openstack/python-heatclient/centos/python-heatclient.spec @@ -0,0 +1,230 @@ +%{!?upstream_version: %global upstream_version %{version}%{?milestone}} + +%global sname heatclient +%global with_doc 0 + + +%if 0%{?fedora} +%global with_python3 1 +%endif + +%global common_desc \ +This is a client for the OpenStack Heat API. There's a Python API (the \ +heatclient module), and a command-line script (heat). Each implements 100% of \ +the OpenStack Heat API. + +Name: python-heatclient +Version: 1.16.1 +Release: 1%{?_tis_dist}.%{tis_patch_ver} +Summary: Python API and CLI for OpenStack Heat + +License: ASL 2.0 +URL: https://launchpad.net/python-heatclient +Source0: https://tarballs.openstack.org/%{name}/%{name}-%{upstream_version}.tar.gz + +BuildArch: noarch + +%description +%{common_desc} + +%package -n python2-%{sname} +Summary: Python API and CLI for OpenStack Heat +%{?python_provide:%python_provide python2-heatclient} +BuildRequires: python2-devel +BuildRequires: python2-setuptools +BuildRequires: python2-pip +BuildRequires: python2-wheel +BuildRequires: python2-pbr +BuildRequires: git + +Requires: python2-babel +Requires: python2-iso8601 +Requires: python2-keystoneauth1 >= 3.4.0 +Requires: python2-osc-lib >= 1.8.0 +Requires: python2-prettytable +Requires: python2-pbr +Requires: python2-six +Requires: python2-oslo-serialization >= 2.18.0 +Requires: python2-oslo-utils >= 3.33.0 +Requires: python2-oslo-i18n >= 3.15.3 +Requires: python2-swiftclient >= 3.2.0 +Requires: python2-requests +Requires: python2-cliff +%if 0%{?fedora} > 0 +Requires: python2-pyyaml +%else +Requires: PyYAML +%endif + +%description -n python2-%{sname} +%{common_desc} + +%if 0%{?with_python3} +%package -n python3-%{sname} +Summary: Python API and CLI for OpenStack Heat +%{?python_provide:%python_provide python3-heatclient} +BuildRequires: python3-devel +BuildRequires: python3-setuptools +BuildRequires: python3-pbr + +Requires: python3-babel +Requires: python3-cliff +Requires: python3-iso8601 +Requires: python3-keystoneauth1 >= 3.4.0 +Requires: python3-osc-lib >= 1.8.0 +Requires: python3-prettytable +Requires: python3-pbr +Requires: python3-six +Requires: python3-oslo-serialization >= 2.18.0 +Requires: python3-oslo-utils >= 3.33.0 +Requires: python3-oslo-i18n >= 3.15.3 +Requires: python3-swiftclient >= 3.2.0 +Requires: python3-requests +Requires: python3-PyYAML + +%description -n python3-%{sname} +%{common_desc} +%endif + +%if 0%{?with_doc} +%package doc +Summary: Documentation for OpenStack Heat API Client + +BuildRequires: python2-sphinx +BuildRequires: python2-sphinxcontrib-apidoc +BuildRequires: python2-openstackdocstheme +BuildRequires: python2-babel +BuildRequires: python2-iso8601 +BuildRequires: python2-keystoneauth1 +BuildRequires: python2-osc-lib +BuildRequires: python2-prettytable +BuildRequires: python2-pbr +BuildRequires: python2-six +BuildRequires: python2-oslo-serialization +BuildRequires: python2-oslo-utils +BuildRequires: python2-oslo-i18n +BuildRequires: python2-swiftclient +BuildRequires: python2-requests +BuildRequires: python2-cliff + +%description doc +%{common_desc} + +This package contains auto-generated documentation. +%endif + +%prep +%autosetup -n %{name}-%{upstream_version} -S git + +rm -rf {test-,}requirements.txt tools/{pip,test}-requires + + +%build +export PBR_VERSION=%{version} +%py2_build +%py2_build_wheel +%if 0%{?with_python3} +%py3_build +%endif + +%install +export PBR_VERSION=%{version} +%if 0%{?with_python3} +%py3_install +echo "%{version}" > %{buildroot}%{python3_sitelib}/heatclient/versioninfo +mv %{buildroot}%{_bindir}/heat %{buildroot}%{_bindir}/heat-%{python3_version} +ln -s ./heat-%{python3_version} %{buildroot}%{_bindir}/heat-3 +# Delete tests +rm -fr %{buildroot}%{python3_sitelib}/heatclient/tests +%endif + +%py2_install +echo "%{version}" > %{buildroot}%{python2_sitelib}/heatclient/versioninfo +mv %{buildroot}%{_bindir}/heat %{buildroot}%{_bindir}/heat-%{python2_version} +ln -s ./heat-%{python2_version} %{buildroot}%{_bindir}/heat-2 + +ln -s ./heat-2 %{buildroot}%{_bindir}/heat + +mkdir -p %{buildroot}%{_sysconfdir}/bash_completion.d +install -pm 644 tools/heat.bash_completion \ + %{buildroot}%{_sysconfdir}/bash_completion.d/heat + +# Delete tests +rm -fr %{buildroot}%{python2_sitelib}/heatclient/tests + +%if 0%{?with_doc} +export PYTHONPATH=. +sphinx-build -W -b html doc/source doc/build/html +# Fix hidden-file-or-dir warnings +rm -fr doc/build/html/.doctrees doc/build/html/.buildinfo + +# generate man page +sphinx-build -W -b man doc/source doc/build/man +install -p -D -m 644 doc/build/man/heat.1 %{buildroot}%{_mandir}/man1/heat.1 +%endif + +# STX: stage wheels +mkdir -p $RPM_BUILD_ROOT/wheels +install -m 644 dist/*.whl $RPM_BUILD_ROOT/wheels/ + +# STX: prep SDK package +mkdir -p %{buildroot}/usr/share/remote-clients +tar zcf %{buildroot}/usr/share/remote-clients/%{name}-%{version}.tgz --exclude='.gitignore' --exclude='.gitreview' -C .. %{name}-%{version} + + +%files -n python2-%{sname} +%doc README.rst +%license LICENSE +%{python2_sitelib}/heatclient +%{python2_sitelib}/*.egg-info +%{_sysconfdir}/bash_completion.d +%if 0%{?with_doc} +%{_mandir}/man1/heat.1.gz +%endif +%{_bindir}/heat +%{_bindir}/heat-2 +%{_bindir}/heat-%{python2_version} + +%if 0%{?with_python3} +%files -n python3-%{sname} +%license LICENSE +%doc README.rst +%{python3_sitelib}/%{sname} +%{python3_sitelib}/*.egg-info +%{_sysconfdir}/bash_completion.d +%if 0%{?with_doc} +%{_mandir}/man1/heat.1.gz +%endif +%{_bindir}/heat-3 +%{_bindir}/heat-%{python3_version} +%endif + +%if 0%{?with_doc} +%files doc +%doc doc/build/html +%license LICENSE +%endif + +%package sdk +Summary: SDK files for %{name} + +%description sdk +Contains SDK files for %{name} package + +%files sdk +/usr/share/remote-clients/%{name}-%{version}.tgz + +%package wheels +Summary: %{name} wheels + +%description wheels +Contains python wheels for %{name} + +%files wheels +/wheels/* + + +%changelog +* Fri Aug 10 2018 RDO 1.16.1-1 +- Update to 1.16.1 + diff --git a/openstack/python-heatclient/centos/python-heatclient.spec.orig b/openstack/python-heatclient/centos/python-heatclient.spec.orig new file mode 100644 index 00000000..a7187a27 --- /dev/null +++ b/openstack/python-heatclient/centos/python-heatclient.spec.orig @@ -0,0 +1,185 @@ +%{!?upstream_version: %global upstream_version %{version}%{?milestone}} + +%global sname heatclient + +%if 0%{?fedora} +%global with_python3 1 +%endif + +%global common_desc \ +This is a client for the OpenStack Heat API. There's a Python API (the \ +heatclient module), and a command-line script (heat). Each implements 100% of \ +the OpenStack Heat API. + +Name: python-heatclient +Version: 1.16.1 +Release: 1%{?dist} +Summary: Python API and CLI for OpenStack Heat + +License: ASL 2.0 +URL: https://launchpad.net/python-heatclient +Source0: https://tarballs.openstack.org/%{name}/%{name}-%{upstream_version}.tar.gz + +BuildArch: noarch + +%description +%{common_desc} + +%package -n python2-%{sname} +Summary: Python API and CLI for OpenStack Heat +%{?python_provide:%python_provide python2-heatclient} +BuildRequires: python2-devel +BuildRequires: python2-setuptools +BuildRequires: python2-pbr +BuildRequires: git + +Requires: python2-babel +Requires: python2-iso8601 +Requires: python2-keystoneauth1 >= 3.4.0 +Requires: python2-osc-lib >= 1.8.0 +Requires: python2-prettytable +Requires: python2-pbr +Requires: python2-six +Requires: python2-oslo-serialization >= 2.18.0 +Requires: python2-oslo-utils >= 3.33.0 +Requires: python2-oslo-i18n >= 3.15.3 +Requires: python2-swiftclient >= 3.2.0 +Requires: python2-requests +Requires: python2-cliff +%if 0%{?fedora} > 0 +Requires: python2-pyyaml +%else +Requires: PyYAML +%endif + +%description -n python2-%{sname} +%{common_desc} + +%if 0%{?with_python3} +%package -n python3-%{sname} +Summary: Python API and CLI for OpenStack Heat +%{?python_provide:%python_provide python3-heatclient} +BuildRequires: python3-devel +BuildRequires: python3-setuptools +BuildRequires: python3-pbr + +Requires: python3-babel +Requires: python3-cliff +Requires: python3-iso8601 +Requires: python3-keystoneauth1 >= 3.4.0 +Requires: python3-osc-lib >= 1.8.0 +Requires: python3-prettytable +Requires: python3-pbr +Requires: python3-six +Requires: python3-oslo-serialization >= 2.18.0 +Requires: python3-oslo-utils >= 3.33.0 +Requires: python3-oslo-i18n >= 3.15.3 +Requires: python3-swiftclient >= 3.2.0 +Requires: python3-requests +Requires: python3-PyYAML + +%description -n python3-%{sname} +%{common_desc} +%endif + +%package doc +Summary: Documentation for OpenStack Heat API Client + +BuildRequires: python2-sphinx +BuildRequires: python2-openstackdocstheme +BuildRequires: python2-babel +BuildRequires: python2-iso8601 +BuildRequires: python2-keystoneauth1 +BuildRequires: python2-osc-lib +BuildRequires: python2-prettytable +BuildRequires: python2-pbr +BuildRequires: python2-six +BuildRequires: python2-oslo-serialization +BuildRequires: python2-oslo-utils +BuildRequires: python2-oslo-i18n +BuildRequires: python2-swiftclient +BuildRequires: python2-requests +BuildRequires: python2-cliff + +%description doc +%{common_desc} + +This package contains auto-generated documentation. + +%prep +%autosetup -n %{name}-%{upstream_version} -S git + +rm -rf {test-,}requirements.txt tools/{pip,test}-requires + + +%build +%py2_build +%if 0%{?with_python3} +%py3_build +%endif + +%install +%if 0%{?with_python3} +%py3_install +echo "%{version}" > %{buildroot}%{python3_sitelib}/heatclient/versioninfo +mv %{buildroot}%{_bindir}/heat %{buildroot}%{_bindir}/heat-%{python3_version} +ln -s ./heat-%{python3_version} %{buildroot}%{_bindir}/heat-3 +# Delete tests +rm -fr %{buildroot}%{python3_sitelib}/heatclient/tests +%endif + +%py2_install +echo "%{version}" > %{buildroot}%{python2_sitelib}/heatclient/versioninfo +mv %{buildroot}%{_bindir}/heat %{buildroot}%{_bindir}/heat-%{python2_version} +ln -s ./heat-%{python2_version} %{buildroot}%{_bindir}/heat-2 + +ln -s ./heat-2 %{buildroot}%{_bindir}/heat + +mkdir -p %{buildroot}%{_sysconfdir}/bash_completion.d +install -pm 644 tools/heat.bash_completion \ + %{buildroot}%{_sysconfdir}/bash_completion.d/heat + +# Delete tests +rm -fr %{buildroot}%{python2_sitelib}/heatclient/tests + + +export PYTHONPATH=. +sphinx-build -W -b html doc/source doc/build/html +# Fix hidden-file-or-dir warnings +rm -fr doc/build/html/.doctrees doc/build/html/.buildinfo + +# generate man page +sphinx-build -W -b man doc/source doc/build/man +install -p -D -m 644 doc/build/man/heat.1 %{buildroot}%{_mandir}/man1/heat.1 + +%files -n python2-%{sname} +%doc README.rst +%license LICENSE +%{python2_sitelib}/heatclient +%{python2_sitelib}/*.egg-info +%{_sysconfdir}/bash_completion.d +%{_mandir}/man1/heat.1.gz +%{_bindir}/heat +%{_bindir}/heat-2 +%{_bindir}/heat-%{python2_version} + +%if 0%{?with_python3} +%files -n python3-%{sname} +%license LICENSE +%doc README.rst +%{python3_sitelib}/%{sname} +%{python3_sitelib}/*.egg-info +%{_sysconfdir}/bash_completion.d +%{_mandir}/man1/heat.1.gz +%{_bindir}/heat-3 +%{_bindir}/heat-%{python3_version} +%endif + +%files doc +%doc doc/build/html +%license LICENSE + +%changelog +* Fri Aug 10 2018 RDO 1.16.1-1 +- Update to 1.16.1 + diff --git a/openstack/python-heatclient/centos/srpm_path b/openstack/python-heatclient/centos/srpm_path deleted file mode 100644 index 31f2ec6f..00000000 --- a/openstack/python-heatclient/centos/srpm_path +++ /dev/null @@ -1,2 +0,0 @@ -mirror:Source/python-heatclient-1.11.1-1.el7.src.rpm - diff --git a/openstack/python-horizon/centos/files/0001-Remove-WRS-imports-from-novaclient.patch b/openstack/python-horizon/centos/files/0001-Remove-WRS-imports-from-novaclient.patch new file mode 100644 index 00000000..ac15f269 --- /dev/null +++ b/openstack/python-horizon/centos/files/0001-Remove-WRS-imports-from-novaclient.patch @@ -0,0 +1,70 @@ +diff --git a/openstack_dashboard/api/nova.py b/openstack_dashboard/api/nova.py +index 39a7684..e6798e9 100755 +--- a/openstack_dashboard/api/nova.py ++++ b/openstack_dashboard/api/nova.py +@@ -38,10 +38,6 @@ from novaclient.v2 import instance_action as nova_instance_action + from novaclient.v2 import list_extensions as nova_list_extensions + from novaclient.v2 import servers as nova_servers + +-# Todo (ediardo): move all wrs* and func wrappers into stx-gui +-from novaclient.v2 import wrs_pci +-from novaclient.v2 import wrs_providernets +- + from horizon import exceptions + from horizon import exceptions as horizon_exceptions + from horizon.utils import functions as utils +@@ -1123,54 +1119,6 @@ def requires_keypair(): + return features.get('requires_keypair', False) + + +-# WRS: Nova extension for provider network. +-@profiler.trace +-def provider_network_get(request, providernet_id): +- return wrs_providernets.ProviderNetsManager(novaclient(request)).get( +- providernet_id) +- +- +-# WRS: Nova extension for device usage +-@profiler.trace +-class DeviceUsage(base.APIResourceWrapper): +- """Wrapper for Inventory Device Usage""" +- _attrs = ['device_name', 'device_id', 'vendor_id', 'class_id', +- 'pci_vfs_configured', 'pci_vfs_used', +- 'pci_pfs_configured', 'pci_pfs_used'] +- +- +-@profiler.trace +-def get_device_usage_list(request): +- usages = wrs_pci.PciDevicesManager(novaclient(request)).list() +- return [DeviceUsage(n) for n in usages] +- +- +-@profiler.trace +-def get_device_usage(request, device_id): +- if device_id is None: +- raise nova_exceptions.ResourceNotFound +- +- usage = wrs_pci.PciDevicesManager(novaclient(request)).list( +- device=device_id) +- return DeviceUsage(usage[0]) +- +- +-# WRS: Nova extension for detail device usage +-@profiler.trace +-class DetailUsage(base.APIResourceWrapper): +- """Wrapper for Inventory Device Usage""" +- _attrs = ['host', +- 'pci_vfs_configured', 'pci_vfs_used', +- 'pci_pfs_configured', 'pci_pfs_used'] +- +- +-@profiler.trace +-def get_detail_usage(request, device_id): +- usages = wrs_pci.PciDevicesManager(novaclient(request)).get( +- device_id) +- return [DetailUsage(n) for n in usages] +- +- + def can_set_quotas(): + features = getattr(settings, 'OPENSTACK_HYPERVISOR_FEATURES', {}) + return features.get('enable_quotas', True) diff --git a/openstack/python-horizon/centos/python-django-horizon.spec b/openstack/python-horizon/centos/python-django-horizon.spec index 02407a8a..56acd9aa 100755 --- a/openstack/python-horizon/centos/python-django-horizon.spec +++ b/openstack/python-horizon/centos/python-django-horizon.spec @@ -30,6 +30,8 @@ Source12: horizon-region-exclusions.csv Source13: guni_config.py Source14: horizon-assets-compress +Patch1: 0001-Remove-WRS-imports-from-novaclient.patch + # # BuildArch needs to be located below patches in the spec file. Don't ask! # @@ -247,6 +249,7 @@ Customization module for OpenStack Dashboard to provide a branded logo. %prep %autosetup -n horizon-%{upstream_version} -S git +# autosetup automatically applies the patches # STX remove troublesome files introduced by tox rm -f openstack_dashboard/test/.secret_key_store diff --git a/openstack/python-ironicclient/centos/build_srpm.data b/openstack/python-ironicclient/centos/build_srpm.data index f46b146e..dec438d1 100644 --- a/openstack/python-ironicclient/centos/build_srpm.data +++ b/openstack/python-ironicclient/centos/build_srpm.data @@ -1,5 +1,3 @@ TAR_NAME="python-ironicclient" SRC_DIR="$CGCS_BASE/git/python-ironicclient" - -TIS_BASE_SRCREV=096834f09ae5d8cabc8c0b1ccbac271ddb13e2ee -TIS_PATCH_VER=1 +TIS_PATCH_VER=0 diff --git a/openstack/python-ironicclient/centos/python-ironicclient.spec b/openstack/python-ironicclient/centos/python-ironicclient.spec index 0bab47ab..ed2aa9b7 100644 --- a/openstack/python-ironicclient/centos/python-ironicclient.spec +++ b/openstack/python-ironicclient/centos/python-ironicclient.spec @@ -6,9 +6,11 @@ %global sname ironicclient +%global common_desc A python and command line client library for Ironic + Name: python-ironicclient -Version: 1.17.0 -Release: 0%{?_tis_dist}.%{tis_patch_ver} +Version: 2.5.0 +Release: 1%{?_tis_dist}.%{tis_patch_ver} Summary: Python client for Ironic License: ASL 2.0 @@ -18,38 +20,42 @@ BuildArch: noarch %description -A python and command line client library for Ironic. +%{common_desc} %package -n python2-%{sname} Summary: Python client for Ironic BuildRequires: python2-devel +BuildRequires: python2-pbr >= 2.0.0 +BuildRequires: python2-setuptools BuildRequires: python2-pip BuildRequires: python2-wheel -BuildRequires: python-pbr >= 2.0.0 -BuildRequires: python-setuptools -Requires: python-appdirs >= 1.3.0 +Requires: python2-appdirs >= 1.3.0 +Requires: python2-keystoneauth1 >= 3.4.0 +Requires: python2-pbr >= 2.0.0 +Requires: python2-prettytable +Requires: python2-six >= 1.10.0 +Requires: python2-osc-lib >= 1.10.0 +Requires: python2-oslo-i18n >= 3.15.3 +Requires: python2-oslo-serialization >= 2.18.0 +Requires: python2-oslo-utils >= 3.33.0 +Requires: python2-requests +%if 0%{?fedora} > 0 +Requires: python2-dogpile-cache >= 0.6.2 +Requires: python2-jsonschema +Requires: python2-pyyaml +%else Requires: python-dogpile-cache >= 0.6.2 -Requires: python-httplib2 Requires: python-jsonschema -Requires: python-openstackclient >= 3.3.0 -Requires: python-keystoneauth1 >= 3.1.0 -Requires: python-pbr >= 2.0.0 -Requires: python-prettytable -Requires: python-six >= 1.9.0 -Requires: python-osc-lib >= 1.7.0 -Requires: python-oslo-i18n >= 2.1.0 -Requires: python-oslo-serialization >= 1.10.0 -Requires: python-oslo-utils >= 3.20.0 -Requires: python-requests Requires: PyYAML +%endif %{?python_provide:%python_provide python2-%{sname}} %description -n python2-%{sname} -A python and command line client library for Ironic +%{common_desc} %if 0%{?with_python3} @@ -62,24 +68,22 @@ BuildRequires: python3-setuptools Requires: python3-appdirs >= 1.3.0 Requires: python3-dogpile-cache >= 0.6.2 -Requires: python3-httplib2 Requires: python3-jsonschema -Requires: python3-openstackclient >= 3.3.0 -Requires: python3-keystoneauth1 >= 3.1.0 +Requires: python3-keystoneauth1 >= 3.4.0 Requires: python3-pbr >= 2.0.0 Requires: python3-prettytable -Requires: python3-six >= 1.9.0 -Requires: python3-osc-lib >= 1.7.0 -Requires: python3-oslo-i18n >= 2.1.0 -Requires: python3-oslo-serialization >= 1.10.0 -Requires: python3-oslo-utils >= 3.20.0 +Requires: python3-six >= 1.10.0 +Requires: python3-osc-lib >= 1.10.0 +Requires: python3-oslo-i18n >= 3.15.3 +Requires: python3-oslo-serialization >= 2.18.0 +Requires: python3-oslo-utils >= 3.33.0 Requires: python3-requests Requires: python3-PyYAML %{?python_provide:%python_provide python3-%{sname}} %description -n python3-%{sname} -A python and command line client library for Ironic +%{common_desc} %endif %prep @@ -112,11 +116,10 @@ ln -s ./ironic-%{python2_version} %{buildroot}%{_bindir}/ironic-2 ln -s ./ironic-2 %{buildroot}%{_bindir}/ironic -install -p -D -m 644 tools/ironic.bash_completion %{buildroot}%{_sysconfdir}/bash_completion.d/ironic.bash_completion - mkdir -p $RPM_BUILD_ROOT/wheels install -m 644 dist/*.whl $RPM_BUILD_ROOT/wheels/ + %files -n python2-%{sname} %doc README.rst %license LICENSE @@ -125,7 +128,6 @@ install -m 644 dist/*.whl $RPM_BUILD_ROOT/wheels/ %{_bindir}/ironic-%{python2_version} %{python2_sitelib}/ironicclient* %{python2_sitelib}/python_ironicclient* -%{_sysconfdir}/bash_completion.d/ironic.bash_completion %if 0%{?with_python3} %files -n python3-%{sname} @@ -148,9 +150,6 @@ Contains python wheels for %{name} %changelog -* Wed Sep 06 2017 rdo-trunk 1.17.0-1 -- Update to 1.17.0 - -* Mon Aug 14 2017 Alfredo Moralejo 1.16.0-1 -- Update to 1.16.0 +* Fri Aug 10 2018 RDO 2.5.0-1 +- Update to 2.5.0 diff --git a/openstack/python-ironicclient/centos/python-ironicclient.spec.orig b/openstack/python-ironicclient/centos/python-ironicclient.spec.orig new file mode 100644 index 00000000..6afc704e --- /dev/null +++ b/openstack/python-ironicclient/centos/python-ironicclient.spec.orig @@ -0,0 +1,138 @@ +%{!?upstream_version: %global upstream_version %{version}%{?milestone}} + +%if 0%{?fedora} +%global with_python3 1 +%endif + +%global sname ironicclient + +%global common_desc A python and command line client library for Ironic + +Name: python-ironicclient +Version: 2.5.0 +Release: 1%{?dist} +Summary: Python client for Ironic + +License: ASL 2.0 +URL: https://pypi.python.org/pypi/python-ironicclient +Source0: https://tarballs.openstack.org/python-ironicclient/python-ironicclient-%{version}%{?milestone}.tar.gz +BuildArch: noarch + + +%description +%{common_desc} + + +%package -n python2-%{sname} +Summary: Python client for Ironic + +BuildRequires: python2-devel +BuildRequires: python2-pbr >= 2.0.0 +BuildRequires: python2-setuptools + +Requires: python2-appdirs >= 1.3.0 +Requires: python2-keystoneauth1 >= 3.4.0 +Requires: python2-pbr >= 2.0.0 +Requires: python2-prettytable +Requires: python2-six >= 1.10.0 +Requires: python2-osc-lib >= 1.10.0 +Requires: python2-oslo-i18n >= 3.15.3 +Requires: python2-oslo-serialization >= 2.18.0 +Requires: python2-oslo-utils >= 3.33.0 +Requires: python2-requests +%if 0%{?fedora} > 0 +Requires: python2-dogpile-cache >= 0.6.2 +Requires: python2-jsonschema +Requires: python2-pyyaml +%else +Requires: python-dogpile-cache >= 0.6.2 +Requires: python-jsonschema +Requires: PyYAML +%endif + +%{?python_provide:%python_provide python2-%{sname}} + +%description -n python2-%{sname} +%{common_desc} + + +%if 0%{?with_python3} +%package -n python3-%{sname} +Summary: Python client for Ironic + +BuildRequires: python3-devel +BuildRequires: python3-pbr >= 2.0.0 +BuildRequires: python3-setuptools + +Requires: python3-appdirs >= 1.3.0 +Requires: python3-dogpile-cache >= 0.6.2 +Requires: python3-jsonschema +Requires: python3-keystoneauth1 >= 3.4.0 +Requires: python3-pbr >= 2.0.0 +Requires: python3-prettytable +Requires: python3-six >= 1.10.0 +Requires: python3-osc-lib >= 1.10.0 +Requires: python3-oslo-i18n >= 3.15.3 +Requires: python3-oslo-serialization >= 2.18.0 +Requires: python3-oslo-utils >= 3.33.0 +Requires: python3-requests +Requires: python3-PyYAML + +%{?python_provide:%python_provide python3-%{sname}} + +%description -n python3-%{sname} +%{common_desc} +%endif + +%prep +%setup -q -n %{name}-%{upstream_version} + +# Remove the requirements file so that pbr hooks don't add it +# to distutils requires_dist config +rm -rf {test-,}requirements.txt tools/{pip,test}-requires + +%build +%py2_build +%if 0%{?with_python3} +%py3_build +%endif + + +%install +%if 0%{?with_python3} +%py3_install +mv %{buildroot}%{_bindir}/ironic %{buildroot}%{_bindir}/ironic-%{python3_version} +ln -s ./ironic-%{python3_version} %{buildroot}%{_bindir}/ironic-3 +%endif + +%py2_install +mv %{buildroot}%{_bindir}/ironic %{buildroot}%{_bindir}/ironic-%{python2_version} +ln -s ./ironic-%{python2_version} %{buildroot}%{_bindir}/ironic-2 + +ln -s ./ironic-2 %{buildroot}%{_bindir}/ironic + + +%files -n python2-%{sname} +%doc README.rst +%license LICENSE +%{_bindir}/ironic +%{_bindir}/ironic-2 +%{_bindir}/ironic-%{python2_version} +%{python2_sitelib}/ironicclient* +%{python2_sitelib}/python_ironicclient* + +%if 0%{?with_python3} +%files -n python3-%{sname} +%doc README.rst +%license LICENSE +%{_bindir}/ironic-3 +%{_bindir}/ironic-%{python3_version} +%{python3_sitelib}/ironicclient* +%{python3_sitelib}/python_ironicclient* +%endif + + +%changelog +* Fri Aug 10 2018 RDO 2.5.0-1 +- Update to 2.5.0 + diff --git a/openstack/python-keystoneclient/centos/build_srpm.data b/openstack/python-keystoneclient/centos/build_srpm.data index c66bf348..2aaf1fbb 100644 --- a/openstack/python-keystoneclient/centos/build_srpm.data +++ b/openstack/python-keystoneclient/centos/build_srpm.data @@ -1 +1,4 @@ -TIS_PATCH_VER=7 +TAR_NAME=python-keystoneclient +SRC_DIR=$CGCS_BASE/git/python-keystoneclient +TIS_PATCH_VER=0 + diff --git a/openstack/python-keystoneclient/centos/meta_patches/0001-Update-package-versioning-for-TIS-format.patch b/openstack/python-keystoneclient/centos/meta_patches/0001-Update-package-versioning-for-TIS-format.patch deleted file mode 100644 index ca1e1ae1..00000000 --- a/openstack/python-keystoneclient/centos/meta_patches/0001-Update-package-versioning-for-TIS-format.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/SPECS/python-keystoneclient.spec b/SPECS/python-keystoneclient.spec -index 79ab30f..e68bc6f 100644 ---- a/SPECS/python-keystoneclient.spec -+++ b/SPECS/python-keystoneclient.spec -@@ -8,7 +8,7 @@ - Name: python-keystoneclient - Epoch: 1 - Version: 3.13.0 --Release: 1%{?dist} -+Release: 1.el7%{?_tis_dist}.%{tis_patch_ver} - Summary: Client library for OpenStack Identity API - License: ASL 2.0 - URL: https://launchpad.net/python-keystoneclient diff --git a/openstack/python-keystoneclient/centos/meta_patches/0002-meta-public-adminURL-detection.patch b/openstack/python-keystoneclient/centos/meta_patches/0002-meta-public-adminURL-detection.patch deleted file mode 100644 index b3cafac8..00000000 --- a/openstack/python-keystoneclient/centos/meta_patches/0002-meta-public-adminURL-detection.patch +++ /dev/null @@ -1,16 +0,0 @@ -diff --git a/SPECS/python-keystoneclient.spec b/SPECS/python-keystoneclient.spec -index e68bc6f..c71629d 100644 ---- a/SPECS/python-keystoneclient.spec -+++ b/SPECS/python-keystoneclient.spec -@@ -14,6 +14,11 @@ License: ASL 2.0 - URL: https://launchpad.net/python-keystoneclient - Source0: https://tarballs.openstack.org/%{name}/%{name}-%{version}.tar.gz - -+# WRS -+Patch0001: internal-keystone-client-public-adminURL-detection.patch -+ -+# BuildArch needs to be located below patches in the spec file -+ - BuildArch: noarch - - BuildRequires: /usr/bin/openssl diff --git a/openstack/python-keystoneclient/centos/meta_patches/0003-meta-TiS-remote-client-sdk-patch.patch b/openstack/python-keystoneclient/centos/meta_patches/0003-meta-TiS-remote-client-sdk-patch.patch deleted file mode 100644 index 2417f565..00000000 --- a/openstack/python-keystoneclient/centos/meta_patches/0003-meta-TiS-remote-client-sdk-patch.patch +++ /dev/null @@ -1,47 +0,0 @@ -diff --git a/SPECS/python-keystoneclient.spec b/SPECS/python-keystoneclient.spec -index 2844d30..edd6720 100644 ---- a/SPECS/python-keystoneclient.spec -+++ b/SPECS/python-keystoneclient.spec -@@ -167,6 +167,12 @@ BuildRequires: python-openstackdocstheme - %description doc - Documentation for the keystoneclient module - -+%package sdk -+Summary: SDK files for %{name} -+ -+%description sdk -+Contains SDK files for %{name} package -+ - %prep - %autosetup -n %{name}-%{upstream_version} -S git - -@@ -194,6 +200,10 @@ rm -rf {test-,}requirements.txt - # Fix hidden-file-or-dir warnings - rm -fr doc/build/html/.{doctrees,buildinfo} - -+# prep SDK package -+mkdir -p %{buildroot}/usr/share/remote-clients/%{name} -+tar zcf %{buildroot}/usr/share/remote-clients/%{name}/%{name}-%{version}.tgz --exclude='.gitignore' --exclude='.gitreview' -C .. %{name}-%{version} -+ - - %check - %{__python2} setup.py test -@@ -202,6 +212,7 @@ rm -fr .testrepository - %{__python3} setup.py test - %endif - -+ - %files -n python2-keystoneclient - %license LICENSE - %doc README.rst -@@ -232,6 +243,10 @@ rm -fr .testrepository - %{python3_sitelib}/keystoneclient/tests - %endif - -+%files sdk -+/usr/share/remote-clients/%{name}/%{name}-%{version}.tgz -+ -+ - %changelog - * Fri Aug 11 2017 Alfredo Moralejo 1:3.13.0-1 - - Update to 3.13.0 diff --git a/openstack/python-keystoneclient/centos/meta_patches/0004-meta-dont-remove-requirements-txt.patch b/openstack/python-keystoneclient/centos/meta_patches/0004-meta-dont-remove-requirements-txt.patch deleted file mode 100644 index 457afaa1..00000000 --- a/openstack/python-keystoneclient/centos/meta_patches/0004-meta-dont-remove-requirements-txt.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/SPECS/python-keystoneclient.spec b/SPECS/python-keystoneclient.spec -index edd6720..a41311e 100644 ---- a/SPECS/python-keystoneclient.spec -+++ b/SPECS/python-keystoneclient.spec -@@ -181,7 +181,7 @@ Contains SDK files for %{name} package - sed -i 's/^warning-is-error.*/warning-is-error = 0/g' setup.cfg - - # Let RPM handle the dependencies --rm -rf {test-,}requirements.txt -+rm -f test-requirements.txt - - %build - %py2_build diff --git a/openstack/python-keystoneclient/centos/meta_patches/0006-meta-buildrequires-python-setuptools_scm.patch b/openstack/python-keystoneclient/centos/meta_patches/0006-meta-buildrequires-python-setuptools_scm.patch deleted file mode 100644 index b5e83be4..00000000 --- a/openstack/python-keystoneclient/centos/meta_patches/0006-meta-buildrequires-python-setuptools_scm.patch +++ /dev/null @@ -1,20 +0,0 @@ -diff --git a/SPECS/python-keystoneclient.spec b/SPECS/python-keystoneclient.spec -index 965c437..efc0c4b 100644 ---- a/SPECS/python-keystoneclient.spec -+++ b/SPECS/python-keystoneclient.spec -@@ -34,6 +34,7 @@ Summary: Client library for OpenStack Identity API - - BuildRequires: python2-devel - BuildRequires: python-setuptools -+BuildRequires: python2-setuptools_scm - BuildRequires: python-pbr >= 2.0.0 - BuildRequires: git - -@@ -61,6 +62,7 @@ Summary: Client library for OpenStack Identity API - - BuildRequires: python3-devel - BuildRequires: python3-setuptools -+BuildRequires: python3-setuptools_scm - BuildRequires: python3-pbr >= 2.0.0 - - Requires: python3-oslo-config >= 2:4.0.0 diff --git a/openstack/python-keystoneclient/centos/meta_patches/PATCH_ORDER b/openstack/python-keystoneclient/centos/meta_patches/PATCH_ORDER deleted file mode 100644 index 3a2b04aa..00000000 --- a/openstack/python-keystoneclient/centos/meta_patches/PATCH_ORDER +++ /dev/null @@ -1,5 +0,0 @@ -0001-Update-package-versioning-for-TIS-format.patch -0002-meta-public-adminURL-detection.patch -0003-meta-TiS-remote-client-sdk-patch.patch -0004-meta-dont-remove-requirements-txt.patch -0006-meta-buildrequires-python-setuptools_scm.patch diff --git a/openstack/python-keystoneclient/centos/patches/internal-keystone-client-public-adminURL-detection.patch b/openstack/python-keystoneclient/centos/patches/internal-keystone-client-public-adminURL-detection.patch deleted file mode 100644 index af5c7cc9..00000000 --- a/openstack/python-keystoneclient/centos/patches/internal-keystone-client-public-adminURL-detection.patch +++ /dev/null @@ -1,55 +0,0 @@ -From e9d61bd41cfbe8cf424d13052c35f298f5beb1e2 Mon Sep 17 00:00:00 2001 -From: Scott Little -Date: Tue, 24 Jan 2017 15:19:33 -0500 -Subject: [PATCH] TiS-remote-client-sdk-patch - ---- - keystoneclient/v2_0/client.py | 18 ++++++++++++++++++ - 1 file changed, 18 insertions(+) - -diff --git a/keystoneclient/v2_0/client.py b/keystoneclient/v2_0/client.py -index 904f769..003c5b1 100644 ---- a/keystoneclient/v2_0/client.py -+++ b/keystoneclient/v2_0/client.py -@@ -13,6 +13,7 @@ - # License for the specific language governing permissions and limitations - # under the License. - -+import os - import logging - import warnings - -@@ -30,6 +31,9 @@ from keystoneclient.v2_0 import tenants - from keystoneclient.v2_0 import tokens - from keystoneclient.v2_0 import users - -+import requests -+from requests.packages.urllib3.exceptions import InsecureRequestWarning -+from requests.packages.urllib3 import disable_warnings as urllib3_disable_warnings - - _logger = logging.getLogger(__name__) - -@@ -154,6 +158,20 @@ class Client(httpclient.HTTPClient): - 'deprecated as of the 1.7.0 release and may be removed in ' - 'the 2.0.0 release.', DeprecationWarning) - -+ # NOTE(knasim-wrs): As per US76645, the Keystone adminURL -+ # is no longer an internal address since it needs to be -+ # accessible via remote Openstack client. Things get -+ # complicated with HTTPS where the internal keystone client -+ # gets this adminURL and cannot connect to Keystone server -+ # as it cannot verify the SSL certificate. -+ # We will check for this condition here, if OS_ENDPOINT_TYPE -+ # is not publicURL then this is an internal access scenario and -+ # Keystone client will be set to SSL insecure mode -+ if os.environ.get('OS_ENDPOINT_TYPE') == 'internalURL': -+ kwargs['insecure'] = True -+ # disable verbose insecurity warnings -+ urllib3_disable_warnings(InsecureRequestWarning) -+ - super(Client, self).__init__(**kwargs) - - self.certificates = certificates.CertificatesManager(self._adapter) --- -1.8.3.1 - diff --git a/openstack/python-keystoneclient/centos/python-keystoneclient.spec b/openstack/python-keystoneclient/centos/python-keystoneclient.spec new file mode 100644 index 00000000..82f73902 --- /dev/null +++ b/openstack/python-keystoneclient/centos/python-keystoneclient.spec @@ -0,0 +1,278 @@ +%{!?upstream_version: %global upstream_version %{version}%{?milestone}} + +%if 0%{?fedora} +%global with_python3 1 +%endif + +%global common_desc \ +Client library and command line utility for interacting with Openstack \ +Identity API. + +Name: python-keystoneclient +Epoch: 1 +Version: 3.17.0 +Release: 1%{?_tis_dist}.%{tis_patch_ver} +Summary: Client library for OpenStack Identity API +License: ASL 2.0 +URL: https://launchpad.net/python-keystoneclient +Source0: https://tarballs.openstack.org/%{name}/%{name}-%{version}.tar.gz + +BuildArch: noarch + +BuildRequires: /usr/bin/openssl + + +%description +%{common_desc} + +%package -n python2-keystoneclient +Summary: Client library for OpenStack Identity API +%{?python_provide:%python_provide python2-keystoneclient} + +BuildRequires: python2-devel +BuildRequires: python2-setuptools +BuildRequires: python2-pip +BuildRequires: python2-wheel +BuildRequires: python2-pbr >= 2.0.0 +BuildRequires: git + +Requires: python2-oslo-config >= 2:5.2.0 +Requires: python2-oslo-i18n >= 3.15.3 +Requires: python2-oslo-serialization >= 2.18.0 +Requires: python2-oslo-utils >= 3.33.0 +Requires: python2-requests >= 2.14.2 +Requires: python2-six >= 1.10.0 +Requires: python2-stevedore >= 1.20.0 +Requires: python2-pbr >= 2.0.0 +Requires: python2-debtcollector >= 1.2.0 +Requires: python2-keystoneauth1 >= 3.4.0 +%if 0%{?fedora} > 0 +Requires: python2-keyring >= 5.5.1 +%else +Requires: python-keyring >= 5.5.1 +%endif + +%description -n python2-keystoneclient +%{common_desc} + +%if 0%{?with_python3} +%package -n python3-keystoneclient +Summary: Client library for OpenStack Identity API +%{?python_provide:%python_provide python3-keystoneclient} + +BuildRequires: python3-devel +BuildRequires: python3-setuptools +BuildRequires: python3-pbr >= 2.0.0 + +Requires: python3-oslo-config >= 2:5.2.0 +Requires: python3-oslo-i18n >= 3.15.3 +Requires: python3-oslo-serialization >= 2.18.0 +Requires: python3-oslo-utils >= 3.33.0 +Requires: python3-requests >= 2.14.2 +Requires: python3-six >= 1.10.0 +Requires: python3-stevedore >= 1.20.0 +Requires: python3-pbr >= 2.0.0 +Requires: python3-debtcollector >= 1.2.0 +Requires: python3-keystoneauth1 >= 3.4.0 +Requires: python3-keyring >= 5.5.1 + +%description -n python3-keystoneclient +Client library for interacting with Openstack Identity API. +%endif + +%package -n python2-keystoneclient-tests +Summary: python2-keystoneclient test subpackage +Requires: python2-keystoneclient = %{epoch}:%{version}-%{release} + +BuildRequires: python2-hacking +BuildRequires: python2-fixtures +BuildRequires: python2-mock +BuildRequires: python2-oauthlib +BuildRequires: python2-oslotest +BuildRequires: python2-testtools +BuildRequires: python2-keystoneauth1 +BuildRequires: python2-oslo-config +BuildRequires: python2-oslo-utils +BuildRequires: python2-oslo-serialization +BuildRequires: python2-oslo-i18n +BuildRequires: python2-stestr +BuildRequires: python2-testresources +BuildRequires: python2-testscenarios +%if 0%{?fedora} > 0 +BuildRequires: python2-keyring >= 5.5.1 +BuildRequires: python2-lxml +BuildRequires: python2-requests-mock +%else +BuildRequires: python-keyring >= 5.5.1 +BuildRequires: python-lxml +BuildRequires: python-requests-mock +%endif + +Requires: python2-hacking +Requires: python2-fixtures +Requires: python2-mock +Requires: python2-oauthlib +Requires: python2-oslotest +Requires: python2-stestr +Requires: python2-testtools +Requires: python2-testresources +Requires: python2-testscenarios +%if 0%{?fedora} > 0 +Requires: python2-lxml +Requires: python2-requests-mock +%else +Requires: python-lxml +Requires: python-requests-mock +%endif + + +%description -n python2-keystoneclient-tests +python2-keystoneclient test subpackages + +%if 0%{?with_python3} +%package -n python3-keystoneclient-tests +Summary: python3-keystoneclient test subpackage +Requires: python3-keystoneclient = %{epoch}:%{version}-%{release} + +BuildRequires: python3-hacking +BuildRequires: python3-fixtures +BuildRequires: python3-keyring >= 5.5.1 +BuildRequires: python3-lxml +BuildRequires: python3-mock +BuildRequires: python3-oauthlib +BuildRequires: python3-oslotest +BuildRequires: python3-requests-mock +BuildRequires: python3-testresources +BuildRequires: python3-testscenarios +BuildRequires: python3-testtools +BuildRequires: python3-keystoneauth1 +BuildRequires: python3-oslo-config +BuildRequires: python3-oslo-utils +BuildRequires: python3-oslo-serialization +BuildRequires: python3-oslo-i18n +BuildRequires: python3-stestr + +Requires: python3-hacking +Requires: python3-fixtures +Requires: python3-lxml +Requires: python3-mock +Requires: python3-oauthlib +Requires: python3-oslotest +Requires: python3-requests-mock +Requires: python3-stestr +Requires: python3-testresources +Requires: python3-testscenarios +Requires: python3-testtools + + +%description -n python3-keystoneclient-tests +python3-keystoneclient test subpackages +%endif + +%package doc +Summary: Documentation for OpenStack Keystone API client + +BuildRequires: python2-sphinx +BuildRequires: python2-openstackdocstheme + +%description doc +Documentation for the keystoneclient module + +%prep +%autosetup -n %{name}-%{upstream_version} -S git + +# disable warning-is-error, this project has intersphinx in docs +# so some warnings are generated in network isolated build environment +# as koji +sed -i 's/^warning-is-error.*/warning-is-error = 0/g' setup.cfg + +# Let RPM handle the dependencies +rm -rf {test-,}requirements.txt + +%build +export PBR_VERSION=%{version} +%py2_build +%py2_build_wheel +%if 0%{?with_python3} +%py3_build +%endif + +%install +export PBR_VERSION=%{version} +%py2_install +%if 0%{?with_python3} +%py3_install +%endif + +# Build HTML docs +%{__python2} setup.py build_sphinx -b html +# Fix hidden-file-or-dir warnings +rm -fr doc/build/html/.{doctrees,buildinfo} + +# STX: stage wheels +mkdir -p $RPM_BUILD_ROOT/wheels +install -m 644 dist/*.whl $RPM_BUILD_ROOT/wheels/ + +# STX: prep SDK package +mkdir -p %{buildroot}/usr/share/remote-clients +tar zcf %{buildroot}/usr/share/remote-clients/%{name}-%{version}.tgz --exclude='.gitignore' --exclude='.gitreview' -C .. %{name}-%{version} + +%check +stestr --test-path=./keystoneclient/tests/unit run +%if 0%{?with_python3} +stestr-3 --test-path=./keystoneclient/tests/unit run +%endif + +%files -n python2-keystoneclient +%license LICENSE +%doc README.rst +%{python2_sitelib}/keystoneclient +%{python2_sitelib}/*.egg-info +%exclude %{python2_sitelib}/keystoneclient/tests + +%if 0%{?with_python3} +%files -n python3-keystoneclient +%license LICENSE +%doc README.rst +%{python3_sitelib}/keystoneclient +%{python3_sitelib}/*.egg-info +%exclude %{python3_sitelib}/keystoneclient/tests +%endif + +%files doc +%doc doc/build/html +%license LICENSE + +%files -n python2-keystoneclient-tests +%license LICENSE +%{python2_sitelib}/keystoneclient/tests + +%if 0%{?with_python3} +%files -n python3-keystoneclient-tests +%license LICENSE +%{python3_sitelib}/keystoneclient/tests +%endif + +%package sdk +Summary: SDK files for %{name} + +%description sdk +Contains SDK files for %{name} package + +%files sdk +/usr/share/remote-clients/%{name}-%{version}.tgz + +%package wheels +Summary: %{name} wheels + +%description wheels +Contains python wheels for %{name} + +%files wheels +/wheels/* + + +%changelog +* Wed Aug 08 2018 RDO 1:3.17.0-1 +- Update to 3.17.0 + diff --git a/openstack/python-keystoneclient/centos/python-keystoneclient.spec.orig b/openstack/python-keystoneclient/centos/python-keystoneclient.spec.orig new file mode 100644 index 00000000..3060722f --- /dev/null +++ b/openstack/python-keystoneclient/centos/python-keystoneclient.spec.orig @@ -0,0 +1,247 @@ +%{!?upstream_version: %global upstream_version %{version}%{?milestone}} + +%if 0%{?fedora} +%global with_python3 1 +%endif + +%global common_desc \ +Client library and command line utility for interacting with Openstack \ +Identity API. + +Name: python-keystoneclient +Epoch: 1 +Version: 3.17.0 +Release: 1%{?dist} +Summary: Client library for OpenStack Identity API +License: ASL 2.0 +URL: https://launchpad.net/python-keystoneclient +Source0: https://tarballs.openstack.org/%{name}/%{name}-%{version}.tar.gz + +BuildArch: noarch + +BuildRequires: /usr/bin/openssl + + +%description +%{common_desc} + +%package -n python2-keystoneclient +Summary: Client library for OpenStack Identity API +%{?python_provide:%python_provide python2-keystoneclient} + +BuildRequires: python2-devel +BuildRequires: python2-setuptools +BuildRequires: python2-pbr >= 2.0.0 +BuildRequires: git + +Requires: python2-oslo-config >= 2:5.2.0 +Requires: python2-oslo-i18n >= 3.15.3 +Requires: python2-oslo-serialization >= 2.18.0 +Requires: python2-oslo-utils >= 3.33.0 +Requires: python2-requests >= 2.14.2 +Requires: python2-six >= 1.10.0 +Requires: python2-stevedore >= 1.20.0 +Requires: python2-pbr >= 2.0.0 +Requires: python2-debtcollector >= 1.2.0 +Requires: python2-keystoneauth1 >= 3.4.0 +%if 0%{?fedora} > 0 +Requires: python2-keyring >= 5.5.1 +%else +Requires: python-keyring >= 5.5.1 +%endif + +%description -n python2-keystoneclient +%{common_desc} + +%if 0%{?with_python3} +%package -n python3-keystoneclient +Summary: Client library for OpenStack Identity API +%{?python_provide:%python_provide python3-keystoneclient} + +BuildRequires: python3-devel +BuildRequires: python3-setuptools +BuildRequires: python3-pbr >= 2.0.0 + +Requires: python3-oslo-config >= 2:5.2.0 +Requires: python3-oslo-i18n >= 3.15.3 +Requires: python3-oslo-serialization >= 2.18.0 +Requires: python3-oslo-utils >= 3.33.0 +Requires: python3-requests >= 2.14.2 +Requires: python3-six >= 1.10.0 +Requires: python3-stevedore >= 1.20.0 +Requires: python3-pbr >= 2.0.0 +Requires: python3-debtcollector >= 1.2.0 +Requires: python3-keystoneauth1 >= 3.4.0 +Requires: python3-keyring >= 5.5.1 + +%description -n python3-keystoneclient +Client library for interacting with Openstack Identity API. +%endif + +%package -n python2-keystoneclient-tests +Summary: python2-keystoneclient test subpackage +Requires: python2-keystoneclient = %{epoch}:%{version}-%{release} + +BuildRequires: python2-hacking +BuildRequires: python2-fixtures +BuildRequires: python2-mock +BuildRequires: python2-oauthlib +BuildRequires: python2-oslotest +BuildRequires: python2-testtools +BuildRequires: python2-keystoneauth1 +BuildRequires: python2-oslo-config +BuildRequires: python2-oslo-utils +BuildRequires: python2-oslo-serialization +BuildRequires: python2-oslo-i18n +BuildRequires: python2-stestr +BuildRequires: python2-testresources +BuildRequires: python2-testscenarios +%if 0%{?fedora} > 0 +BuildRequires: python2-keyring >= 5.5.1 +BuildRequires: python2-lxml +BuildRequires: python2-requests-mock +%else +BuildRequires: python-keyring >= 5.5.1 +BuildRequires: python-lxml +BuildRequires: python-requests-mock +%endif + +Requires: python2-hacking +Requires: python2-fixtures +Requires: python2-mock +Requires: python2-oauthlib +Requires: python2-oslotest +Requires: python2-stestr +Requires: python2-testtools +Requires: python2-testresources +Requires: python2-testscenarios +%if 0%{?fedora} > 0 +Requires: python2-lxml +Requires: python2-requests-mock +%else +Requires: python-lxml +Requires: python-requests-mock +%endif + + +%description -n python2-keystoneclient-tests +python2-keystoneclient test subpackages + +%if 0%{?with_python3} +%package -n python3-keystoneclient-tests +Summary: python3-keystoneclient test subpackage +Requires: python3-keystoneclient = %{epoch}:%{version}-%{release} + +BuildRequires: python3-hacking +BuildRequires: python3-fixtures +BuildRequires: python3-keyring >= 5.5.1 +BuildRequires: python3-lxml +BuildRequires: python3-mock +BuildRequires: python3-oauthlib +BuildRequires: python3-oslotest +BuildRequires: python3-requests-mock +BuildRequires: python3-testresources +BuildRequires: python3-testscenarios +BuildRequires: python3-testtools +BuildRequires: python3-keystoneauth1 +BuildRequires: python3-oslo-config +BuildRequires: python3-oslo-utils +BuildRequires: python3-oslo-serialization +BuildRequires: python3-oslo-i18n +BuildRequires: python3-stestr + +Requires: python3-hacking +Requires: python3-fixtures +Requires: python3-lxml +Requires: python3-mock +Requires: python3-oauthlib +Requires: python3-oslotest +Requires: python3-requests-mock +Requires: python3-stestr +Requires: python3-testresources +Requires: python3-testscenarios +Requires: python3-testtools + + +%description -n python3-keystoneclient-tests +python3-keystoneclient test subpackages +%endif + +%package doc +Summary: Documentation for OpenStack Keystone API client + +BuildRequires: python2-sphinx +BuildRequires: python2-openstackdocstheme + +%description doc +Documentation for the keystoneclient module + +%prep +%autosetup -n %{name}-%{upstream_version} -S git + +# disable warning-is-error, this project has intersphinx in docs +# so some warnings are generated in network isolated build environment +# as koji +sed -i 's/^warning-is-error.*/warning-is-error = 0/g' setup.cfg + +# Let RPM handle the dependencies +rm -rf {test-,}requirements.txt + +%build +%py2_build +%if 0%{?with_python3} +%py3_build +%endif + +%install +%py2_install +%if 0%{?with_python3} +%py3_install +%endif + +# Build HTML docs +%{__python2} setup.py build_sphinx -b html +# Fix hidden-file-or-dir warnings +rm -fr doc/build/html/.{doctrees,buildinfo} + + +%check +stestr --test-path=./keystoneclient/tests/unit run +%if 0%{?with_python3} +stestr-3 --test-path=./keystoneclient/tests/unit run +%endif + +%files -n python2-keystoneclient +%license LICENSE +%doc README.rst +%{python2_sitelib}/keystoneclient +%{python2_sitelib}/*.egg-info +%exclude %{python2_sitelib}/keystoneclient/tests + +%if 0%{?with_python3} +%files -n python3-keystoneclient +%license LICENSE +%doc README.rst +%{python3_sitelib}/keystoneclient +%{python3_sitelib}/*.egg-info +%exclude %{python3_sitelib}/keystoneclient/tests +%endif + +%files doc +%doc doc/build/html +%license LICENSE + +%files -n python2-keystoneclient-tests +%license LICENSE +%{python2_sitelib}/keystoneclient/tests + +%if 0%{?with_python3} +%files -n python3-keystoneclient-tests +%license LICENSE +%{python3_sitelib}/keystoneclient/tests +%endif + +%changelog +* Wed Aug 08 2018 RDO 1:3.17.0-1 +- Update to 3.17.0 + diff --git a/openstack/python-keystoneclient/centos/srpm_path b/openstack/python-keystoneclient/centos/srpm_path deleted file mode 100644 index d2bd6c67..00000000 --- a/openstack/python-keystoneclient/centos/srpm_path +++ /dev/null @@ -1 +0,0 @@ -mirror:Source/python-keystoneclient-3.13.0-1.el7.src.rpm diff --git a/openstack/python-keystoneclient/python-keystoneclient/CGCSkeyringsupport.patch b/openstack/python-keystoneclient/python-keystoneclient/CGCSkeyringsupport.patch deleted file mode 100644 index 9777de3b..00000000 --- a/openstack/python-keystoneclient/python-keystoneclient/CGCSkeyringsupport.patch +++ /dev/null @@ -1,144 +0,0 @@ -Index: git/keystoneclient/shell.py -=================================================================== ---- git.orig/keystoneclient/shell.py 2014-09-17 13:06:07.761186569 -0400 -+++ git/keystoneclient/shell.py 2014-09-22 15:10:36.326737219 -0400 -@@ -24,6 +24,7 @@ - - from __future__ import print_function - -+import os - import argparse - import getpass - import logging -@@ -32,6 +33,8 @@ - - import six - -+import keyring -+ - import keystoneclient - from keystoneclient import access - from keystoneclient.contrib.bootstrap import shell as shell_bootstrap -@@ -333,6 +336,11 @@ - '--os-username or env[OS_USERNAME]') - - if not args.os_password: -+ # priviledge check (only allow Keyring retrieval if we are root) -+ if os.geteuid() == 0: -+ args.os_password = keyring.get_password('CGCS', args.os_username) -+ -+ if not args.os_password: - # No password, If we've got a tty, try prompting for it - if hasattr(sys.stdin, 'isatty') and sys.stdin.isatty(): - # Check for Ctl-D -Index: git/keystoneclient/probe.py -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ git/keystoneclient/probe.py 2014-09-23 10:41:57.758412311 -0400 -@@ -0,0 +1,106 @@ -+# -+# Copyright (c) 2014 Wind River Systems, Inc. -+# SPDX-License-Identifier: Apache-2.0 -+# -+# -+# -+# -+ -+""" -+OCF sanity probe to prevent cleartext password -+""" -+ -+import os -+import sys -+import json -+import urllib2 -+import datetime -+import keyring -+import logging -+import logging.handlers -+ -+_loggers = {} -+ -+def get_logger(name): -+ """ Get a logger or create one """ -+ if name not in _loggers: -+ _loggers[name] = logging.getLogger(name) -+ -+ return _loggers[name] -+ -+ -+def setup_logger(logger): -+ """ Setup a logger """ -+ syslog_facility = logging.handlers.SysLogHandler.LOG_SYSLOG -+ -+ formatter = logging.Formatter("probe_keyring[%(process)d] " + -+ "%(pathname)s:%(lineno)s " + -+ "%(levelname)8s [%(name)s] %(message)s") -+ -+ handler = logging.handlers.SysLogHandler(address='/dev/log', -+ facility=syslog_facility) -+ handler.setLevel(logging.INFO) -+ handler.setFormatter(formatter) -+ -+ logger.addHandler(handler) -+ logger.setLevel(logging.INFO) -+ -+def configure(): -+ """ Setup logging """ -+ for logger in _loggers: -+ setup_logger(_loggers[logger]) -+ -+LOG = get_logger(__name__) -+ -+def probe(auth_url, tenant, login): -+ """ Asks OpenStack Keystone for a token """ -+ -+ try: -+ url = auth_url + "tokens" -+ request_info = urllib2.Request(url) -+ request_info.add_header("Content-type", "application/json") -+ request_info.add_header("Accept", "application/json") -+ payload = json.dumps( -+ {"auth": {"tenantName": tenant, -+ "passwordCredentials": {"username": login, -+ "password": keyring.get_password('CGCS',login)}}}) -+ request_info.add_data(payload) -+ -+ request = urllib2.urlopen(request_info) -+ response = json.loads(request.read()) -+ request.close() -+ return response['access']['token']['id'] -+ -+ except Exception as e: -+ LOG.error("%s, %s" % (e.code, e.read())) -+ return None -+ -+def main(): -+ -+ global cmd_auth_url -+ global cmd_tenant -+ global cmd_os_username -+ -+ cmd_auth_url = "http://127.0.0.1:5000/v2.0/tokens" -+ cmd_tenant = "tenant" -+ cmd_os_username = "username" -+ -+ configure() -+ -+# priviledge check (only allow Keyring retrieval if we are root) -+ if os.geteuid() == 0: -+ arg = 1 -+ cmd_auth_url = sys.argv[arg] -+ arg += 1 -+ cmd_tenant = sys.argv[arg] -+ arg += 1 -+ cmd_os_username = sys.argv[arg] -+ -+ try: -+ token_id = probe(cmd_auth_url, cmd_tenant, cmd_os_username) -+ if token_id is None: -+ sys.exit(-1) -+ sys.exit(0) -+ except Exception as e: -+ sys.exit(-1) -+ diff --git a/openstack/python-keystoneclient/python-keystoneclient/extend_token_expiry_window.patch b/openstack/python-keystoneclient/python-keystoneclient/extend_token_expiry_window.patch deleted file mode 100644 index 715aa7de..00000000 --- a/openstack/python-keystoneclient/python-keystoneclient/extend_token_expiry_window.patch +++ /dev/null @@ -1,16 +0,0 @@ -Index: python-keystoneclient-1.3.1/keystoneclient/auth/identity/base.py -=================================================================== ---- python-keystoneclient-1.3.1.orig/keystoneclient/auth/identity/base.py -+++ python-keystoneclient-1.3.1/keystoneclient/auth/identity/base.py -@@ -34,8 +34,9 @@ def get_options(): - @six.add_metaclass(abc.ABCMeta) - class BaseIdentityPlugin(base.BaseAuthPlugin): - -- # we count a token as valid if it is valid for at least this many seconds -- MIN_TOKEN_LIFE_SECONDS = 1 -+ # we count a token as valid (not needing refreshing) if it is valid for at -+ # least this many seconds before the token expiry time -+ MIN_TOKEN_LIFE_SECONDS = 120 - - def __init__(self, - auth_url=None, diff --git a/openstack/python-keystoneclient/python-keystoneclient/internal-keystone-client-public-adminURL-detection.patch b/openstack/python-keystoneclient/python-keystoneclient/internal-keystone-client-public-adminURL-detection.patch deleted file mode 100644 index fb64fed0..00000000 --- a/openstack/python-keystoneclient/python-keystoneclient/internal-keystone-client-public-adminURL-detection.patch +++ /dev/null @@ -1,45 +0,0 @@ ---- - keystoneclient/v2_0/client.py | 18 ++++++++++++++++++ - 1 file changed, 18 insertions(+) - ---- a/keystoneclient/v2_0/client.py -+++ b/keystoneclient/v2_0/client.py -@@ -13,6 +13,7 @@ - # License for the specific language governing permissions and limitations - # under the License. - -+import os - import logging - - from keystoneclient.auth.identity import v2 as v2_auth -@@ -29,6 +30,8 @@ from keystoneclient.v2_0 import tenants - from keystoneclient.v2_0 import tokens - from keystoneclient.v2_0 import users - -+import requests -+from requests.packages.urllib3.exceptions import InsecureRequestWarning - - _logger = logging.getLogger(__name__) - -@@ -130,6 +133,21 @@ class Client(httpclient.HTTPClient): - - def __init__(self, **kwargs): - """Initialize a new client for the Keystone v2.0 API.""" -+ -+ # NOTE(knasim-wrs): As per US76645, the Keystone adminURL -+ # is no longer an internal address since it needs to be -+ # accessible via remote Openstack client. Things get -+ # complicated with HTTPS where the internal keystone client -+ # gets this adminURL and cannot connect to Keystone server -+ # as it cannot verify the SSL certificate. -+ # We will check for this condition here, if OS_ENDPOINT_TYPE -+ # is not publicURL then this is an internal access scenario and -+ # Keystone client will be set to SSL insecure mode -+ if os.environ.get('OS_ENDPOINT_TYPE') == 'internalURL': -+ kwargs['insecure'] = True -+ # disable verbose insecurity warnings -+ requests.packages.urllib3.disable_warnings(InsecureRequestWarning) -+ - super(Client, self).__init__(**kwargs) - - self.certificates = certificates.CertificatesManager(self._adapter) diff --git a/openstack/python-keystoneclient/python-keystoneclient/v2-client-empty-password-check.patch b/openstack/python-keystoneclient/python-keystoneclient/v2-client-empty-password-check.patch deleted file mode 100644 index a7988f05..00000000 --- a/openstack/python-keystoneclient/python-keystoneclient/v2-client-empty-password-check.patch +++ /dev/null @@ -1,26 +0,0 @@ ---- - keystoneclient/v2_0/shell.py | 6 ++++-- - 1 file changed, 4 insertions(+), 2 deletions(-) - ---- a/keystoneclient/v2_0/shell.py -+++ b/keystoneclient/v2_0/shell.py -@@ -141,7 +141,8 @@ def do_user_password_update(kc, args): - """Update user password.""" - user = utils.find_resource(kc.users, args.user) - new_passwd = args.passwd or utils.prompt_for_password() -- if new_passwd is None: -+ # if password is empty or blank then reject it -+ if new_passwd is None or new_passwd.strip() is "": - msg = (_("\nPlease specify password using the --pass option " - "or using the prompt")) - sys.exit(msg) -@@ -167,7 +168,8 @@ def do_password_update(kc, args): - currentpasswd = getpass.getpass(_('Current Password: ')) - - newpasswd = args.newpasswd -- while newpasswd is None: -+ # don't allow empty or blank passwords -+ while newpasswd is None or newpasswd.strip() is "": - passwd1 = getpass.getpass(_('New Password: ')) - passwd2 = getpass.getpass(_('Repeat New Password: ')) - if passwd1 == passwd2: diff --git a/openstack/python-magnumclient/centos/build_srpm.data b/openstack/python-magnumclient/centos/build_srpm.data index c5803ec7..6c0a4387 100644 --- a/openstack/python-magnumclient/centos/build_srpm.data +++ b/openstack/python-magnumclient/centos/build_srpm.data @@ -1,6 +1,4 @@ TAR_NAME="python-magnumclient" SRC_DIR="$CGCS_BASE/git/python-magnumclient" - -TIS_BASE_SRCREV=6bef59aec50e41ec2133fad1bd1fc4c954a08312 -TIS_PATCH_VER=1 +TIS_PATCH_VER=0 diff --git a/openstack/python-magnumclient/centos/python-magnumclient.spec b/openstack/python-magnumclient/centos/python-magnumclient.spec index a403e0e2..d5c2071a 100644 --- a/openstack/python-magnumclient/centos/python-magnumclient.spec +++ b/openstack/python-magnumclient/centos/python-magnumclient.spec @@ -9,8 +9,15 @@ %global default_python 2 %endif +%global common_desc \ +This is a client library for Magnum built on the Magnum API. \ +It provides a Python API (the magnumclient module) and a \ +command-line tool (magnum). + +%global common_desc_tests Python-magnumclient test subpackage + Name: python-%{pname} -Version: 2.7.0 +Version: 2.10.0 Release: 1%{?_tis_dist}.%{tis_patch_ver} Summary: Client library for Magnum API @@ -20,49 +27,54 @@ Source0: https://tarballs.openstack.org/%{sname}/%{sname}-%{upstream_vers BuildArch: noarch %description -This is a client library for Magnum built on the Magnum API. -It provides a Python API (the magnumclient module) and a -command-line tool (magnum). +%{common_desc} %package -n python2-%{pname} Summary: Client library for Magnum API %{?python_provide:%python_provide python2-%{pname}} BuildRequires: python2-devel -BuildRequires: python-setuptools +BuildRequires: python2-setuptools BuildRequires: python2-pip BuildRequires: python2-wheel -BuildRequires: python-pbr +BuildRequires: python2-pbr BuildRequires: git # test dependencies -BuildRequires: python-oslo-utils -BuildRequires: python-stevedore -BuildRequires: python-requests -BuildRequires: python-oslo-i18n -BuildRequires: python-fixtures -BuildRequires: python-mock -BuildRequires: python-testtools -BuildRequires: python-keystoneauth1 -BuildRequires: python-prettytable +BuildRequires: python2-oslo-utils +BuildRequires: python2-openstackclient +BuildRequires: python2-oslo-serialization +BuildRequires: python2-oslo-log +BuildRequires: python2-osprofiler +BuildRequires: python2-stevedore +BuildRequires: python2-requests +BuildRequires: python2-oslo-i18n +BuildRequires: python2-fixtures +BuildRequires: python2-mock +BuildRequires: python2-testtools +BuildRequires: python2-keystoneauth1 +BuildRequires: python2-prettytable -Requires: python-babel -Requires: python-cryptography +Requires: python2-babel +Requires: python2-cryptography +Requires: python2-keystoneauth1 >= 3.4.0 +Requires: python2-oslo-i18n >= 3.15.3 +Requires: python2-oslo-log >= 3.36.0 +Requires: python2-oslo-serialization >= 2.18.0 +Requires: python2-oslo-utils >= 3.33.0 +Requires: python2-osc-lib >= 1.8.0 +Requires: python2-os-client-config >= 1.28.0 +Requires: python2-pbr +Requires: python2-prettytable +Requires: python2-six +%if 0%{?fedora} > 0 +Requires: python2-decorator +%else Requires: python-decorator -Requires: python-keystoneauth1 >= 3.1.0 -Requires: python-oslo-i18n >= 2.1.0 -Requires: python-oslo-serialization >= 1.10.0 -Requires: python-oslo-utils >= 3.20.0 -Requires: python-osc-lib >= 1.7.0 -Requires: python-os-client-config >= 1.28.0 -Requires: python-pbr -Requires: python-prettytable -Requires: python-six +%endif %description -n python2-%{pname} -This is a client library for Magnum built on the Magnum API. -It provides a Python API (the magnumclient module) and a -command-line tool (magnum). +%{common_desc} %if 0%{?with_python3} %package -n python3-%{pname} @@ -75,6 +87,10 @@ BuildRequires: python3-pbr # test dependencies BuildRequires: python3-oslo-utils +BuildRequires: python3-openstackclient +BuildRequires: python3-oslo-serialization +BuildRequires: python3-oslo-log +BuildRequires: python3-osprofiler BuildRequires: python3-stevedore BuildRequires: python3-requests BuildRequires: python3-oslo-i18n @@ -87,48 +103,53 @@ BuildRequires: python3-prettytable Requires: python3-babel Requires: python3-cryptography Requires: python3-decorator -Requires: python3-keystoneauth1 >= 3.1.0 -Requires: python3-oslo-i18n >= 2.1.0 -Requires: python3-oslo-serialization >= 1.10.0 -Requires: python3-oslo-utils >= 3.20.0 -Requires: python3-osc-lib >= 1.7.0 +Requires: python3-keystoneauth1 >= 3.4.0 +Requires: python3-oslo-i18n >= 3.15.3 +Requires: python3-oslo-log >= 3.36.0 +Requires: python3-oslo-serialization >= 2.18.0 +Requires: python3-oslo-utils >= 3.33.0 +Requires: python3-osc-lib >= 1.8.0 Requires: python3-os-client-config >= 1.28.0 Requires: python3-pbr Requires: python3-prettytable Requires: python3-six %description -n python3-%{pname} -This is a client library for Magnum built on the Magnum API. -It provides a Python API (the magnumclient module) and a -command-line tool (magnum). +%{common_desc} %endif %package -n python-%{pname}-doc Summary: python-magnumclient documentation -BuildRequires: python-sphinx -BuildRequires: python-openstackdocstheme -BuildRequires: python-os-client-config -#BuildRequires: python-decorator +BuildRequires: python2-sphinx +BuildRequires: python2-openstackdocstheme +BuildRequires: python2-os-client-config +BuildRequires: openstack-macros +%if 0%{?fedora} > 0 +BuildRequires: python2-decorator +%else +BuildRequires: python-decorator +%endif %description -n python-%{pname}-doc Documentation for python-magnumclient -%package -n python-%{pname}-tests +%package -n python2-%{pname}-tests Summary: Python-magnumclient test subpackage +%{?python_provide:%python_provide python2-%{pname}-tests} -Requires: python-%{pname} = %{version}-%{release} -Requires: python-oslo-utils -Requires: python-stevedore -Requires: python-requests -Requires: python-oslo-i18n -Requires: python-fixtures -Requires: python-mock -Requires: python-testtools -Requires: python-keystoneauth1 -Requires: python-prettytable +Requires: python2-%{pname} = %{version}-%{release} +Requires: python2-oslo-utils +Requires: python2-stevedore +Requires: python2-requests +Requires: python2-oslo-i18n +Requires: python2-fixtures +Requires: python2-mock +Requires: python2-testtools +Requires: python2-keystoneauth1 +Requires: python2-prettytable -%description -n python-%{pname}-tests -Python-magnumclient test subpackage +%description -n python2-%{pname}-tests +%{common_desc_tests} %if 0%{?with_python3} %package -n python3-%{pname}-tests @@ -146,34 +167,32 @@ Requires: python3-keystoneauth1 Requires: python3-prettytable %description -n python3-%{pname}-tests -Python-magnumclient test subpackage +%{common_desc_tests} %endif %prep %autosetup -n %{name}-%{upstream_version} -S git # let RPM handle deps -rm -rf {test-,}requirements.txt +%py_req_cleanup %build export PBR_VERSION=%{version} %py2_build +%py2_build_wheel %if 0%{?with_python3} %py3_build %endif # generate html docs -%{__python2} setup.py build_sphinx -b html +# (TODO) Re-add -W once https://review.openstack.org/#/c/554197 is in a +# tagged release +sphinx-build -b html doc/source doc/build/html # Fix hidden-file-or-dir warnings rm -rf doc/build/html/.{doctrees,buildinfo} -%py2_build_wheel - %install export PBR_VERSION=%{version} - -install -p -D -m 644 tools/magnum.bash_completion %{buildroot}%{_sysconfdir}/bash_completion.d/magnum.bash_completion - %if 0%{?with_python3} %py3_install %if %{default_python} >= 3 @@ -182,20 +201,21 @@ mv %{buildroot}%{_bindir}/magnum ./magnum.py3 %endif %py2_install -mkdir -p $RPM_BUILD_ROOT/wheels -install -m 644 dist/*.whl $RPM_BUILD_ROOT/wheels/ %if 0%{?default_python} >= 3 mv magnum.py3 %{buildroot}%{_bindir}/magnum %endif -#%check +mkdir -p $RPM_BUILD_ROOT/wheels +install -m 644 dist/*.whl $RPM_BUILD_ROOT/wheels/ + +%check # tests are failing due to unicode not defined # we are skipping the test -#%{__python2} setup.py test || -#%if 0%{?with_python3} -#%{__python3} setup.py test || -#%endif +%{__python2} setup.py test || +%if 0%{?with_python3} +%{__python3} setup.py test || +%endif %files -n python2-%{pname} %doc README.rst @@ -206,7 +226,6 @@ mv magnum.py3 %{buildroot}%{_bindir}/magnum %endif %{python2_sitelib}/*.egg-info %exclude %{python2_sitelib}/%{pname}/tests -%{_sysconfdir}/bash_completion.d/magnum.bash_completion %if 0%{?with_python3} %files -n python3-%{pname} @@ -224,7 +243,7 @@ mv magnum.py3 %{buildroot}%{_bindir}/magnum %license LICENSE %doc doc/build/html -%files -n python-%{pname}-tests +%files -n python2-%{pname}-tests %{python2_sitelib}/%{pname}/tests %if 0%{?with_python3} @@ -242,6 +261,6 @@ Contains python wheels for %{name} /wheels/* %changelog -* Fri Aug 11 2017 Alfredo Moralejo 2.7.0-1 -- Update to 2.7.0 +* Thu Aug 09 2018 RDO 2.10.0-1 +- Update to 2.10.0 diff --git a/openstack/python-magnumclient/centos/python-magnumclient.spec.orig b/openstack/python-magnumclient/centos/python-magnumclient.spec.orig new file mode 100644 index 00000000..a20f9993 --- /dev/null +++ b/openstack/python-magnumclient/centos/python-magnumclient.spec.orig @@ -0,0 +1,250 @@ +%{!?upstream_version: %global upstream_version %{version}%{?milestone}} +%global sname python-magnumclient +%global pname magnumclient + +%if 0%{?fedora} >= 24 +%global with_python3 1 +%global default_python 3 +%else +%global default_python 2 +%endif + +%global common_desc \ +This is a client library for Magnum built on the Magnum API. \ +It provides a Python API (the magnumclient module) and a \ +command-line tool (magnum). + +%global common_desc_tests Python-magnumclient test subpackage + +Name: python-%{pname} +Version: 2.10.0 +Release: 1%{?dist} +Summary: Client library for Magnum API + +License: ASL 2.0 +URL: https://launchpad.net/python-magnumclient +Source0: https://tarballs.openstack.org/%{sname}/%{sname}-%{upstream_version}.tar.gz +BuildArch: noarch + +%description +%{common_desc} + +%package -n python2-%{pname} +Summary: Client library for Magnum API +%{?python_provide:%python_provide python2-%{pname}} + +BuildRequires: python2-devel +BuildRequires: python2-setuptools +BuildRequires: python2-pbr +BuildRequires: git + +# test dependencies +BuildRequires: python2-oslo-utils +BuildRequires: python2-openstackclient +BuildRequires: python2-oslo-serialization +BuildRequires: python2-oslo-log +BuildRequires: python2-osprofiler +BuildRequires: python2-stevedore +BuildRequires: python2-requests +BuildRequires: python2-oslo-i18n +BuildRequires: python2-fixtures +BuildRequires: python2-mock +BuildRequires: python2-testtools +BuildRequires: python2-keystoneauth1 +BuildRequires: python2-prettytable + +Requires: python2-babel +Requires: python2-cryptography +Requires: python2-keystoneauth1 >= 3.4.0 +Requires: python2-oslo-i18n >= 3.15.3 +Requires: python2-oslo-log >= 3.36.0 +Requires: python2-oslo-serialization >= 2.18.0 +Requires: python2-oslo-utils >= 3.33.0 +Requires: python2-osc-lib >= 1.8.0 +Requires: python2-os-client-config >= 1.28.0 +Requires: python2-pbr +Requires: python2-prettytable +Requires: python2-six +%if 0%{?fedora} > 0 +Requires: python2-decorator +%else +Requires: python-decorator +%endif + +%description -n python2-%{pname} +%{common_desc} + +%if 0%{?with_python3} +%package -n python3-%{pname} +Summary: Client library for Magnum API +%{?python_provide:%python_provide python3-%{pname}} + +BuildRequires: python3-devel +BuildRequires: python3-setuptools +BuildRequires: python3-pbr + +# test dependencies +BuildRequires: python3-oslo-utils +BuildRequires: python3-openstackclient +BuildRequires: python3-oslo-serialization +BuildRequires: python3-oslo-log +BuildRequires: python3-osprofiler +BuildRequires: python3-stevedore +BuildRequires: python3-requests +BuildRequires: python3-oslo-i18n +BuildRequires: python3-fixtures +BuildRequires: python3-mock +BuildRequires: python3-testtools +BuildRequires: python3-keystoneauth1 +BuildRequires: python3-prettytable + +Requires: python3-babel +Requires: python3-cryptography +Requires: python3-decorator +Requires: python3-keystoneauth1 >= 3.4.0 +Requires: python3-oslo-i18n >= 3.15.3 +Requires: python3-oslo-log >= 3.36.0 +Requires: python3-oslo-serialization >= 2.18.0 +Requires: python3-oslo-utils >= 3.33.0 +Requires: python3-osc-lib >= 1.8.0 +Requires: python3-os-client-config >= 1.28.0 +Requires: python3-pbr +Requires: python3-prettytable +Requires: python3-six + +%description -n python3-%{pname} +%{common_desc} +%endif + +%package -n python-%{pname}-doc +Summary: python-magnumclient documentation +BuildRequires: python2-sphinx +BuildRequires: python2-openstackdocstheme +BuildRequires: python2-os-client-config +BuildRequires: openstack-macros +%if 0%{?fedora} > 0 +BuildRequires: python2-decorator +%else +BuildRequires: python-decorator +%endif + +%description -n python-%{pname}-doc +Documentation for python-magnumclient + +%package -n python2-%{pname}-tests +Summary: Python-magnumclient test subpackage +%{?python_provide:%python_provide python2-%{pname}-tests} + +Requires: python2-%{pname} = %{version}-%{release} +Requires: python2-oslo-utils +Requires: python2-stevedore +Requires: python2-requests +Requires: python2-oslo-i18n +Requires: python2-fixtures +Requires: python2-mock +Requires: python2-testtools +Requires: python2-keystoneauth1 +Requires: python2-prettytable + +%description -n python2-%{pname}-tests +%{common_desc_tests} + +%if 0%{?with_python3} +%package -n python3-%{pname}-tests +Summary: Python-magnumclient test subpackage + +Requires: python3-%{pname} = %{version}-%{release} +Requires: python3-oslo-utils +Requires: python3-stevedore +Requires: python3-requests +Requires: python3-oslo-i18n +Requires: python3-fixtures +Requires: python3-mock +Requires: python3-testtools +Requires: python3-keystoneauth1 +Requires: python3-prettytable + +%description -n python3-%{pname}-tests +%{common_desc_tests} +%endif + +%prep +%autosetup -n %{name}-%{upstream_version} -S git + +# let RPM handle deps +%py_req_cleanup + +%build +%py2_build + +%if 0%{?with_python3} +%py3_build +%endif +# generate html docs +# (TODO) Re-add -W once https://review.openstack.org/#/c/554197 is in a +# tagged release +sphinx-build -b html doc/source doc/build/html +# Fix hidden-file-or-dir warnings +rm -rf doc/build/html/.{doctrees,buildinfo} + +%install + +%if 0%{?with_python3} +%py3_install +%if %{default_python} >= 3 +mv %{buildroot}%{_bindir}/magnum ./magnum.py3 +%endif +%endif + +%py2_install + +%if 0%{?default_python} >= 3 +mv magnum.py3 %{buildroot}%{_bindir}/magnum +%endif + +%check +# tests are failing due to unicode not defined +# we are skipping the test +%{__python2} setup.py test || +%if 0%{?with_python3} +%{__python3} setup.py test || +%endif + +%files -n python2-%{pname} +%doc README.rst +%license LICENSE +%{python2_sitelib}/%{pname} +%if 0%{?default_python} <= 2 +%{_bindir}/magnum +%endif +%{python2_sitelib}/*.egg-info +%exclude %{python2_sitelib}/%{pname}/tests + +%if 0%{?with_python3} +%files -n python3-%{pname} +%doc README.rst +%license LICENSE +%if 0%{?default_python} >= 3 +%{_bindir}/magnum +%endif +%{python3_sitelib}/magnumclient +%{python3_sitelib}/*.egg-info +%exclude %{python3_sitelib}/%{pname}/tests +%endif + +%files -n python-%{pname}-doc +%license LICENSE +%doc doc/build/html + +%files -n python2-%{pname}-tests +%{python2_sitelib}/%{pname}/tests + +%if 0%{?with_python3} +%files -n python3-%{pname}-tests +%{python3_sitelib}/%{pname}/tests +%endif + +%changelog +* Thu Aug 09 2018 RDO 2.10.0-1 +- Update to 2.10.0 + diff --git a/openstack/python-muranoclient/centos/build_srpm.data b/openstack/python-muranoclient/centos/build_srpm.data index fb1e0a9f..e84f2d00 100644 --- a/openstack/python-muranoclient/centos/build_srpm.data +++ b/openstack/python-muranoclient/centos/build_srpm.data @@ -1,5 +1,3 @@ TAR_NAME="python-muranoclient" SRC_DIR="$CGCS_BASE/git/python-muranoclient" - -TIS_BASE_SRCREV=9a31e6bd406b18b32a97bd11d0020426dd6ff318 -TIS_PATCH_VER=2 +TIS_PATCH_VER=0 diff --git a/openstack/python-muranoclient/centos/python-muranoclient.spec b/openstack/python-muranoclient/centos/python-muranoclient.spec index 050843aa..efd6ba8d 100644 --- a/openstack/python-muranoclient/centos/python-muranoclient.spec +++ b/openstack/python-muranoclient/centos/python-muranoclient.spec @@ -7,8 +7,12 @@ %{!?upstream_version: %global upstream_version %{version}%{?milestone}} +%global common_desc \ +Client library for Murano built on the Murano API. It provides a Python \ +API (the muranoclient module) and a command-line tool (murano). + Name: python-%{pypi_name} -Version: 0.14.0 +Version: 1.1.1 Release: 1%{?_tis_dist}.%{tis_patch_ver} Summary: Client library for OpenStack Murano API @@ -18,45 +22,46 @@ Source0: https://tarballs.openstack.org/%{name}/%{name}-%{version}.tar.gz BuildArch: noarch -%description -Client library for Murano built on the Murano API. It provides a Python -API (the muranoclient module) and a command-line tool (murano). +BuildRequires: git +BuildRequires: openstack-macros +%description +%{common_desc} %package -n python2-%{pypi_name} -BuildRequires: git BuildRequires: python2-devel -BuildRequires: python-setuptools -BuildRequires: python2-pip +BuildRequires: python2-setuptools BuildRequires: python2-wheel -BuildRequires: python-pbr >= 2.0.0 +BuildRequires: python2-pbr >= 2.0.0 -Requires: python-babel >= 2.3.4 -Requires: python-glanceclient >= 1:2.8.0 -Requires: python-httplib2 >= 0.7.5 -Requires: python-iso8601 >= 0.1.11 -Requires: python-keystoneclient >= 1:3.8.0 -Requires: python-murano-pkg-check >= 0.3.0 -Requires: python-pbr >= 2.0.0 -Requires: python-prettytable >= 0.7 -Requires: python-requests >= 2.10.0 -Requires: python-six >= 1.9.0 -Requires: python-yaql >= 1.1.0 -Requires: python-osc-lib >= 1.7.0 -Requires: python-oslo-log >= 3.22.0 -Requires: python-oslo-i18n >= 2.1.0 -Requires: python-oslo-serialization >= 1.10.0 -Requires: python-oslo-utils >= 3.20.0 -Requires: pyOpenSSL >= 0.14 +Requires: python2-babel >= 2.3.4 +Requires: python2-glanceclient >= 1:2.8.0 +Requires: python2-iso8601 >= 0.1.11 +Requires: python2-keystoneclient >= 1:3.8.0 +Requires: python2-murano-pkg-check >= 0.3.0 +Requires: python2-pbr >= 2.0.0 +Requires: python2-prettytable >= 0.7.2 +Requires: python2-requests >= 2.14.2 +Requires: python2-six >= 1.10.0 +Requires: python2-yaql >= 1.1.3 +Requires: python2-osc-lib >= 1.10.0 +Requires: python2-oslo-log >= 3.36.0 +Requires: python2-oslo-i18n >= 3.15.3 +Requires: python2-oslo-serialization >= 2.18.0 +Requires: python2-oslo-utils >= 3.33.0 +Requires: python2-pyOpenSSL >= 16.2.0 +%if 0%{?fedora} > 0 +Requires: python2-pyyaml >= 3.10 +%else Requires: PyYAML >= 3.10 +%endif Summary: Client library for OpenStack Murano API. %{?python_provide:%python_provide python2-%{pypi_name}} %description -n python2-%{pypi_name} -Client library for Murano built on the Murano API. It provides a Python -API (the muranoclient module) and a command-line tool (murano). +%{common_desc} # Python3 package %if 0%{?with_python3} @@ -71,52 +76,44 @@ BuildRequires: python-tools Requires: python3-babel >= 2.3.4 Requires: python3-glanceclient >= 1:2.8.0 -Requires: python3-httplib2 >= 0.7.5 Requires: python3-iso8601 >= 0.1.11 Requires: python3-keystoneclient >= 1:3.8.0 Requires: python3-murano-pkg-check >= 0.3.0 Requires: python3-pbr >= 2.0.0 -Requires: python3-prettytable >= 0.7 -Requires: python3-requests >= 2.10.0 -Requires: python3-six >= 1.9.0 -Requires: python3-yaql >= 1.1.0 -Requires: python3-osc-lib >= 1.7.0 -Requires: python3-oslo-log >= 3.22.0 -Requires: python3-oslo-i18n >= 2.1.0 -Requires: python3-oslo-serialization >= 1.10.0 -Requires: python3-oslo-utils >= 3.20.0 -Requires: python3-oslo-utils >= 3.18.0 -Requires: python3-pyOpenSSL >= 0.14 +Requires: python3-prettytable >= 0.7.2 +Requires: python3-requests >= 2.14.2 +Requires: python3-six >= 1.10.0 +Requires: python3-yaql >= 1.1.3 +Requires: python3-osc-lib >= 1.10.0 +Requires: python3-oslo-log >= 3.36.0 +Requires: python3-oslo-i18n >= 3.15.3 +Requires: python3-oslo-serialization >= 2.18.0 +Requires: python3-oslo-utils >= 3.33.0 +Requires: python3-oslo-utils >= 3.33.0 +Requires: python3-pyOpenSSL >= 16.2.0 Requires: python3-PyYAML >= 3.10 %description -n python3-%{pypi_name} -Client library for Murano built on the Murano API. It provides a Python -API (the muranoclient module) and a command-line tool (murano). +%{common_desc} %endif # Documentation package %package -n python-%{pypi_name}-doc Summary: Documentation for OpenStack Murano API Client -BuildRequires: python-sphinx -BuildRequires: python-openstackdocstheme +BuildRequires: python2-sphinx +BuildRequires: python2-openstackdocstheme %description -n python-%{pypi_name}-doc Documentation for the client library for interacting with Openstack Murano API. -%package sdk -Summary: SDK files for %{name} - -%description sdk -Contains SDK files for %{name} package - %prep %autosetup -n %{name}-%{upstream_version} -S git # Remove bundled egg-info rm -rf %{pypi_name}.egg-info # Let RPM handle the dependencies -rm -f test-requirements.txt requirements.txt +%py_req_cleanup %if 0%{?with_python3} rm -rf %{py3dir} @@ -127,6 +124,7 @@ cp -a . %{py3dir} %build export PBR_VERSION=%{version} %{__python2} setup.py build +%py2_build_wheel %if 0%{?with_python3} pushd %{py3dir} @@ -135,12 +133,11 @@ popd %endif # generate html docs -%{__python2} setup.py build_sphinx -b html +export PYTHONPATH=. +sphinx-build -W -b html doc/source doc/build/html # remove the sphinx-build leftovers rm -rf doc/build/html/.{doctrees,buildinfo} -%py2_build_wheel - %install export PBR_VERSION=%{version} %if 0%{?with_python3} @@ -151,10 +148,6 @@ popd %endif %{__python2} setup.py install --skip-build --root %{buildroot} -mkdir -p $RPM_BUILD_ROOT/wheels -install -m 644 dist/*.whl $RPM_BUILD_ROOT/wheels/ - -install -p -D -m 644 tools/murano.bash_completion %{buildroot}%{_sysconfdir}/bash_completion.d/murano.bash_completion # rename binaries, make compat symlinks pushd %{buildroot}%{_bindir} @@ -165,17 +158,20 @@ done %endif popd +mkdir -p $RPM_BUILD_ROOT/wheels +install -m 644 dist/*.whl $RPM_BUILD_ROOT/wheels/ + # prep SDK package mkdir -p %{buildroot}/usr/share/remote-clients tar zcf %{buildroot}/usr/share/remote-clients/%{name}-%{version}.tgz --exclude='.gitignore' --exclude='.gitreview' -C .. %{name}-%{version} + %files -n python2-%{pypi_name} %license LICENSE %doc README.rst %{python2_sitelib}/%{pypi_name} %{python2_sitelib}/python_%{pypi_name}-*-py?.?.egg-info %{_bindir}/murano* -%{_sysconfdir}/bash_completion.d/murano.bash_completion # Files for python3 %if 0%{?with_python3} @@ -192,6 +188,12 @@ tar zcf %{buildroot}/usr/share/remote-clients/%{name}-%{version}.tgz --exclude=' %doc doc/build/html %license LICENSE +%package sdk +Summary: SDK files for %{name} + +%description sdk +Contains SDK files for %{name} package + %files sdk /usr/share/remote-clients/%{name}-%{version}.tgz @@ -204,7 +206,9 @@ Contains python wheels for %{name} %files wheels /wheels/* -%changelog -* Mon Aug 14 2017 Alfredo Moralejo 0.14.0-1 -- Update to 0.14.0 + + +%changelog +* Thu Aug 16 2018 RDO 1.1.1-1 +- Update to 1.1.1 diff --git a/openstack/python-muranoclient/centos/python-muranoclient.spec.orig b/openstack/python-muranoclient/centos/python-muranoclient.spec.orig new file mode 100644 index 00000000..7addcb9e --- /dev/null +++ b/openstack/python-muranoclient/centos/python-muranoclient.spec.orig @@ -0,0 +1,182 @@ +%global pypi_name muranoclient + +%if 0%{?fedora} +%global with_python3 0 +%{!?python3_shortver: %global python3_shortver %(%{__python3} -c 'import sys; print(str(sys.version_info.major) + "." + str(sys.version_info.minor))')} +%endif + +%{!?upstream_version: %global upstream_version %{version}%{?milestone}} + +%global common_desc \ +Client library for Murano built on the Murano API. It provides a Python \ +API (the muranoclient module) and a command-line tool (murano). + +Name: python-%{pypi_name} +Version: 1.1.1 +Release: 1%{?dist} +Summary: Client library for OpenStack Murano API + +License: ASL 2.0 +URL: http://pypi.python.org/pypi/%{name} +Source0: https://tarballs.openstack.org/%{name}/%{name}-%{version}.tar.gz + +BuildArch: noarch + +BuildRequires: git +BuildRequires: openstack-macros + +%description +%{common_desc} + +%package -n python2-%{pypi_name} + +BuildRequires: python2-devel +BuildRequires: python2-setuptools +BuildRequires: python2-pbr >= 2.0.0 + +Requires: python2-babel >= 2.3.4 +Requires: python2-glanceclient >= 1:2.8.0 +Requires: python2-iso8601 >= 0.1.11 +Requires: python2-keystoneclient >= 1:3.8.0 +Requires: python2-murano-pkg-check >= 0.3.0 +Requires: python2-pbr >= 2.0.0 +Requires: python2-prettytable >= 0.7.2 +Requires: python2-requests >= 2.14.2 +Requires: python2-six >= 1.10.0 +Requires: python2-yaql >= 1.1.3 +Requires: python2-osc-lib >= 1.10.0 +Requires: python2-oslo-log >= 3.36.0 +Requires: python2-oslo-i18n >= 3.15.3 +Requires: python2-oslo-serialization >= 2.18.0 +Requires: python2-oslo-utils >= 3.33.0 +Requires: python2-pyOpenSSL >= 16.2.0 +%if 0%{?fedora} > 0 +Requires: python2-pyyaml >= 3.10 +%else +Requires: PyYAML >= 3.10 +%endif + +Summary: Client library for OpenStack Murano API. +%{?python_provide:%python_provide python2-%{pypi_name}} + +%description -n python2-%{pypi_name} +%{common_desc} + +# Python3 package +%if 0%{?with_python3} +%package -n python3-%{pypi_name} +Summary: Support of EC2 API for OpenStack +%{?python_provide:%python_provide python3-%{pypi_name}} + +BuildRequires: python3-devel +BuildRequires: python3-setuptools +BuildRequires: python3-pbr >= 2.0.0 +BuildRequires: python-tools + +Requires: python3-babel >= 2.3.4 +Requires: python3-glanceclient >= 1:2.8.0 +Requires: python3-iso8601 >= 0.1.11 +Requires: python3-keystoneclient >= 1:3.8.0 +Requires: python3-murano-pkg-check >= 0.3.0 +Requires: python3-pbr >= 2.0.0 +Requires: python3-prettytable >= 0.7.2 +Requires: python3-requests >= 2.14.2 +Requires: python3-six >= 1.10.0 +Requires: python3-yaql >= 1.1.3 +Requires: python3-osc-lib >= 1.10.0 +Requires: python3-oslo-log >= 3.36.0 +Requires: python3-oslo-i18n >= 3.15.3 +Requires: python3-oslo-serialization >= 2.18.0 +Requires: python3-oslo-utils >= 3.33.0 +Requires: python3-oslo-utils >= 3.33.0 +Requires: python3-pyOpenSSL >= 16.2.0 +Requires: python3-PyYAML >= 3.10 + +%description -n python3-%{pypi_name} +%{common_desc} +%endif + +# Documentation package +%package -n python-%{pypi_name}-doc +Summary: Documentation for OpenStack Murano API Client + +BuildRequires: python2-sphinx +BuildRequires: python2-openstackdocstheme + +%description -n python-%{pypi_name}-doc +Documentation for the client library for interacting with Openstack +Murano API. + +%prep +%autosetup -n %{name}-%{upstream_version} -S git +# Remove bundled egg-info +rm -rf %{pypi_name}.egg-info +# Let RPM handle the dependencies +%py_req_cleanup + +%if 0%{?with_python3} +rm -rf %{py3dir} +cp -a . %{py3dir} +2to3 --write --nobackups %{py3dir} +%endif + +%build +%{__python2} setup.py build + +%if 0%{?with_python3} +pushd %{py3dir} +LANG=en_US.UTF-8 %{__python3} setup.py build +popd +%endif + +# generate html docs +export PYTHONPATH=. +sphinx-build -W -b html doc/source doc/build/html +# remove the sphinx-build leftovers +rm -rf doc/build/html/.{doctrees,buildinfo} + +%install +%if 0%{?with_python3} +pushd %{py3dir} +LANG=en_US.UTF-8 %{__python3} setup.py install --skip-build --root %{buildroot} +mv %{buildroot}%{_bindir}/murano %{buildroot}%{_bindir}/python3-murano +popd +%endif + +%{__python2} setup.py install --skip-build --root %{buildroot} + +# rename binaries, make compat symlinks +pushd %{buildroot}%{_bindir} +%if 0%{?with_python3} +for i in %{pypi_name}-{3,%{?python3_shortver}}; do + ln -s python3-%{pypi_name} $i +done +%endif +popd + +%files -n python2-%{pypi_name} +%license LICENSE +%doc README.rst +%{python2_sitelib}/%{pypi_name} +%{python2_sitelib}/python_%{pypi_name}-*-py?.?.egg-info +%{_bindir}/murano* + +# Files for python3 +%if 0%{?with_python3} +%files -n python3-%{pypi_name} +%license LICENSE +%doc README.rst +%{_bindir}/python3-murano +%{_bindir}/murano* +%{python3_sitelib}/%{pypi_name} +%{python3_sitelib}/python_%{pypi_name}-%{version}-py?.?.egg-info +%endif + +%files -n python-%{pypi_name}-doc +%doc doc/build/html +%license LICENSE + +%changelog +* Thu Aug 16 2018 RDO 1.1.1-1 +- Update to 1.1.1 + diff --git a/openstack/python-networking-sfc/centos/python-networking-sfc.spec b/openstack/python-networking-sfc/centos/python-networking-sfc.spec index a015d581..f83a118c 100644 --- a/openstack/python-networking-sfc/centos/python-networking-sfc.spec +++ b/openstack/python-networking-sfc/centos/python-networking-sfc.spec @@ -1,5 +1,7 @@ %global pypi_name networking-sfc %global module networking_sfc +%global with_doc 0 + %{!?upstream_version: %global upstream_version %{version}%{?milestone}} Name: python-%{pypi_name} @@ -91,10 +93,12 @@ implemented as a collection of physical network devices connected in series by cables. +%if 0%{?with_doc} %package -n python-%{pypi_name}-doc Summary: Documentation for networking-sfc %description -n python-%{pypi_name}-doc Documentation for networking-sfc +%endif %package -n python2-%{pypi_name}-tests Summary: Tests for networking-sfc @@ -133,9 +137,11 @@ rm -rf %{module}/tests/unit/cli %build export PBR_VERSION=%{version} %py2_build +%if 0%{?with_doc} %{__python2} setup.py build_sphinx -b html # remove the sphinx-build leftovers rm -rf doc/build/html/.{doctrees,buildinfo} +%endif # generate the configuration file PYTHONPATH=. oslo-config-generator --config-file etc/oslo-config-generator/networking-sfc.conf @@ -167,9 +173,11 @@ mv etc/networking-sfc.conf.sample %{buildroot}%{_sysconfdir}/neutron/conf.d/neut %config(noreplace) %attr(0640, root, neutron) %{_sysconfdir}/neutron/conf.d/neutron-server/networking-sfc.conf %exclude %{python2_sitelib}/%{module}/tests +%if 0%{?with_doc} %files -n python-%{pypi_name}-doc %doc doc/build/html/* %license LICENSE +%endif %files -n python2-%{pypi_name}-tests %{python2_sitelib}/%{module}/tests diff --git a/openstack/python-neutron/centos/stx-neutron.master_docker_image b/openstack/python-neutron/centos/stx-neutron.master_docker_image index 1770ed65..7023e960 100644 --- a/openstack/python-neutron/centos/stx-neutron.master_docker_image +++ b/openstack/python-neutron/centos/stx-neutron.master_docker_image @@ -1,7 +1,12 @@ BUILDER=loci LABEL=stx-neutron PROJECT=neutron -PROJECT_REPO=https://github.com/openstack/neutron.git +# Temporarily pointing to forked neutron repo +# This is necessary to pull in specific commits +# that have not yet merged upstream. +# Once all required commits are merged, this can +# revert back to the upstream repo. +PROJECT_REPO=https://github.com/donpenney/neutron PIP_PACKAGES="networking-sfc pycrypto pylint tinyrpc lxml" DIST_PACKAGES="ethtool lshw" PROFILES="fluent neutron linuxbridge openvswitch" diff --git a/openstack/python-neutronclient/centos/build_srpm.data b/openstack/python-neutronclient/centos/build_srpm.data index f5384f29..8d95970d 100644 --- a/openstack/python-neutronclient/centos/build_srpm.data +++ b/openstack/python-neutronclient/centos/build_srpm.data @@ -1,4 +1,3 @@ TAR_NAME=python-neutronclient SRC_DIR="$CGCS_BASE/git/python-neutronclient" -TIS_BASE_SRCREV=e145c4ef8a0e8390f0468df422a757760e77f823 -TIS_PATCH_VER=GITREVCOUNT +TIS_PATCH_VER=0 diff --git a/openstack/python-neutronclient/centos/python-neutronclient.spec b/openstack/python-neutronclient/centos/python-neutronclient.spec index c6bf26b0..e2eabe7a 100644 --- a/openstack/python-neutronclient/centos/python-neutronclient.spec +++ b/openstack/python-neutronclient/centos/python-neutronclient.spec @@ -6,55 +6,84 @@ %global with_python3 1 %endif +%global common_desc \ +Client library and command line utility for interacting with OpenStack \ +Neutron's API. + Name: python-neutronclient -Version: 6.5.0 +Version: 6.9.1 Release: 1%{?_tis_dist}.%{tis_patch_ver} Summary: Python API and CLI for OpenStack Neutron License: ASL 2.0 -URL: http://launchpad.net/python-neutronclient/ -Source0: %{name}-%{version}.tar.gz +URL: http://launchpad.net/%{name}/ +Source0: https://tarballs.openstack.org/%{name}/%{name}-%{upstream_version}.tar.gz BuildArch: noarch Obsoletes: python-%{sname}-tests <= 4.1.1-3 %description -Client library and command line utility for interacting with OpenStack -Neutron's API. +%{common_desc} %package -n python2-%{sname} Summary: Python API and CLI for OpenStack Neutron %{?python_provide:%python_provide python2-neutronclient} BuildRequires: git +BuildRequires: openstack-macros BuildRequires: python2-devel -BuildRequires: python-setuptools +BuildRequires: python2-setuptools BuildRequires: python2-pip BuildRequires: python2-wheel -BuildRequires: python-pbr +BuildRequires: python2-pbr +# Required for unit tests +BuildRequires: python2-osc-lib-tests +BuildRequires: python2-oslotest +BuildRequires: python2-testtools +BuildRequires: python2-testrepository +BuildRequires: python2-testscenarios -Requires: python-babel >= 2.3.4 -Requires: python-cliff >= 2.8.0 -Requires: python-dateutil -Requires: python-iso8601 >= 0.1.11 -Requires: python-netaddr >= 0.7.13 -Requires: python-os-client-config >= 1.28.0 -Requires: python-oslo-i18n >= 2.1.0 -Requires: python-oslo-serialization >= 1.10.0 -Requires: python-oslo-utils >= 3.20.0 -Requires: python-pbr -Requires: python-requests >= 2.10.0 -Requires: python-simplejson >= 2.2.0 -Requires: python-six >= 1.9.0 -Requires: python-debtcollector >= 1.2.0 -Requires: python-osc-lib >= 1.7.0 -Requires: python-keystoneauth1 >= 3.1.0 -Requires: python-keystoneclient >= 1:3.8.0 +Requires: python2-babel >= 2.3.4 +Requires: python2-iso8601 >= 0.1.11 +Requires: python2-os-client-config >= 1.28.0 +Requires: python2-oslo-i18n >= 3.15.3 +Requires: python2-oslo-log >= 3.36.0 +Requires: python2-oslo-serialization >= 2.18.0 +Requires: python2-oslo-utils >= 3.33.0 +Requires: python2-pbr +Requires: python2-requests >= 2.14.2 +Requires: python2-six >= 1.10.0 +Requires: python2-debtcollector >= 1.2.0 +Requires: python2-osc-lib >= 1.10.0 +Requires: python2-keystoneauth1 >= 3.4.0 +Requires: python2-keystoneclient >= 1:3.8.0 +Requires: python2-cliff >= 2.8.0 +%if 0%{?fedora} > 0 +Requires: python2-netaddr >= 0.7.18 +Requires: python2-simplejson >= 3.5.1 +%else +Requires: python-netaddr >= 0.7.18 +Requires: python-simplejson >= 3.5.1 +%endif %description -n python2-%{sname} -Client library and command line utility for interacting with OpenStack -Neutron's API. +%{common_desc} + +%package -n python2-%{sname}-tests +Summary: Python API and CLI for OpenStack Neutron - Unit tests +%{?python_provide:%python_provide python2-%{sname}-tests} +Requires: python2-%{sname} == %{version}-%{release} +Requires: python2-osc-lib-tests +Requires: python2-oslotest +Requires: python2-testtools +Requires: python2-testrepository +Requires: python2-testscenarios + +%description -n python2-%{sname}-tests +%{common_desc} + +This package containts the unit tests. %if 0%{?with_python3} %package -n python3-%{sname} @@ -64,62 +93,73 @@ Summary: Python API and CLI for OpenStack Neutron BuildRequires: python3-devel BuildRequires: python3-setuptools BuildRequires: python3-pbr +# Required for unit tests +BuildRequires: python3-osc-lib-tests +BuildRequires: python3-oslotest +BuildRequires: python3-testrepository +BuildRequires: python3-testtools +BuildRequires: python3-testscenarios Requires: python3-babel >= 2.3.4 Requires: python3-cliff >= 2.8.0 Requires: python3-iso8601 >= 0.1.11 -Requires: python3-netaddr >= 0.7.13 +Requires: python3-netaddr >= 0.7.18 Requires: python3-os-client-config >= 1.28.0 -Requires: python3-oslo-i18n >= 2.1.0 -Requires: python3-oslo-serialization >= 1.10.0 -Requires: python3-oslo-utils >= 3.20.0 +Requires: python3-oslo-i18n >= 3.15.3 +Requires: python3-oslo-log >= 3.36.0 +Requires: python3-oslo-serialization >= 2.18.0 +Requires: python3-oslo-utils >= 3.33.0 Requires: python3-pbr -Requires: python3-requests >= 2.10.0 -Requires: python3-simplejson >= 2.2.0 -Requires: python3-six >= 1.9.0 +Requires: python3-requests >= 2.14.2 +Requires: python3-simplejson >= 3.5.1 +Requires: python3-six >= 1.10.0 Requires: python3-debtcollector >= 1.2.0 -Requires: python3-osc-lib >= 1.7.0 -Requires: python3-keystoneauth1 >= 3.1.0 +Requires: python3-osc-lib >= 1.10.0 +Requires: python3-keystoneauth1 >= 3.4.0 Requires: python3-keystoneclient >= 1:3.8.0 %description -n python3-%{sname} -Client library and command line utility for interacting with OpenStack -Neutron's API. +%{common_desc} + + +%package -n python3-%{sname}-tests +Summary: Python API and CLI for OpenStack Neutron - Unit tests +%{?python_provide:%python_provide python3-%{sname}-tests} +Requires: python3-%{sname} == %{version}-%{release} +Requires: python3-osc-lib-tests +Requires: python3-oslotest +Requires: python3-testrepository +Requires: python3-testtools +Requires: python3-testscenarios + +%description -n python3-%{sname}-tests +%{common_desc} + +This package containts the unit tests. %endif %package doc Summary: Documentation for OpenStack Neutron API Client -BuildRequires: python-dateutil -BuildRequires: python-sphinx -BuildRequires: python-oslo-sphinx -BuildRequires: python-openstackdocstheme -BuildRequires: python-reno -BuildRequires: python-cliff -BuildRequires: python-keystoneauth1 -BuildRequires: python-keystoneclient -BuildRequires: python-os-client-config -BuildRequires: python-osc-lib -BuildRequires: python-oslo-serialization -BuildRequires: python-oslo-utils +BuildRequires: python2-sphinx +BuildRequires: python2-openstackdocstheme +BuildRequires: python2-reno +BuildRequires: python2-keystoneauth1 +BuildRequires: python2-keystoneclient +BuildRequires: python2-os-client-config +BuildRequires: python2-osc-lib >= 1.10.0 +BuildRequires: python2-oslo-serialization +BuildRequires: python2-oslo-utils +BuildRequires: python2-cliff %description doc -Client library and command line utility for interacting with OpenStack -Neutron's API. - - -%package sdk -Summary: SDK files for %{name} - -%description sdk -Contains SDK files for %{name} package - +%{common_desc} %prep %autosetup -n %{name}-%{upstream_version} -S git # Let RPM handle the dependencies -rm -f test-requirements.txt requirements.txt +%py_req_cleanup %build export PBR_VERSION=%{version} @@ -129,47 +169,56 @@ export PBR_VERSION=%{version} %py3_build %endif +# Build HTML docs +export PYTHONPATH=. +sphinx-build -W -b html doc/source doc/build/html + +# Fix hidden-file-or-dir warnings +rm -rf doc/build/html/.doctrees doc/build/html/.buildinfo + %install export PBR_VERSION=%{version} %if 0%{?with_python3} %py3_install mv %{buildroot}%{_bindir}/neutron %{buildroot}%{_bindir}/neutron-%{python3_version} ln -s ./neutron-%{python3_version} %{buildroot}%{_bindir}/neutron-3 -# Delete tests -rm -fr %{buildroot}%{python3_sitelib}/neutronclient/tests %endif %py2_install -mkdir -p $RPM_BUILD_ROOT/wheels -install -m 644 dist/*.whl $RPM_BUILD_ROOT/wheels/ mv %{buildroot}%{_bindir}/neutron %{buildroot}%{_bindir}/neutron-%{python2_version} ln -s ./neutron-%{python2_version} %{buildroot}%{_bindir}/neutron-2 - ln -s ./neutron-2 %{buildroot}%{_bindir}/neutron -mkdir -p %{buildroot}%{_sysconfdir}/bash_completion.d -install -pm 644 tools/neutron.bash_completion \ - %{buildroot}%{_sysconfdir}/bash_completion.d/neutron +# STX: stage wheel files +mkdir -p $RPM_BUILD_ROOT/wheels +install -m 644 dist/*.whl $RPM_BUILD_ROOT/wheels/ -# Delete tests -rm -fr %{buildroot}%{python2_sitelib}/neutronclient/tests - -%{__python2} setup.py build_sphinx -b html - -# prep SDK package +# STX: prep SDK package mkdir -p %{buildroot}/usr/share/remote-clients/%{name} tar zcf %{buildroot}/usr/share/remote-clients/%{name}/%{name}-%{version}.tgz --exclude='.gitignore' --exclude='.gitreview' -C .. %{name}-%{version} +%check +# (TODO) Ignore unit tests results until https://bugs.launchpad.net/python-neutronclient/+bug/1783789 +# is fixed. +%{__python2} setup.py testr || true +%if 0%{?with_python3} +rm -rf .testrepository +%{__python3} setup.py testr || true +%endif + %files -n python2-%{sname} %doc README.rst %license LICENSE %{python2_sitelib}/neutronclient %{python2_sitelib}/*.egg-info -%{_sysconfdir}/bash_completion.d %{_bindir}/neutron %{_bindir}/neutron-2 %{_bindir}/neutron-%{python2_version} +%exclude %{python2_sitelib}/neutronclient/tests + +%files -n python2-%{sname}-tests +%{python2_sitelib}/neutronclient/tests %if 0%{?with_python3} %files -n python3-%{sname} @@ -177,15 +226,24 @@ tar zcf %{buildroot}/usr/share/remote-clients/%{name}/%{name}-%{version}.tgz --e %doc README.rst %{python3_sitelib}/%{sname} %{python3_sitelib}/*.egg-info -%{_sysconfdir}/bash_completion.d %{_bindir}/neutron-3 %{_bindir}/neutron-%{python3_version} +%exclude %{python3_sitelib}/neutronclient/tests + +%files -n python3-%{sname}-tests +%{python3_sitelib}/neutronclient/tests %endif %files doc %doc doc/build/html %license LICENSE +%package sdk +Summary: SDK files for %{name} + +%description sdk +Contains SDK files for %{name} package + %files sdk /usr/share/remote-clients/%{name}/%{name}-%{version}.tgz @@ -198,7 +256,11 @@ Contains python wheels for %{name} %files wheels /wheels/* -%changelog -* Mon Aug 14 2017 Alfredo Moralejo 6.5.0-1 -- Update to 6.5.0 + +%changelog +* Thu Sep 20 2018 RDO 6.9.1-1 +- Update to 6.9.1 + +* Thu Aug 09 2018 RDO 6.9.0-1 +- Update to 6.9.0 diff --git a/openstack/python-neutronclient/centos/python-neutronclient.spec.orig b/openstack/python-neutronclient/centos/python-neutronclient.spec.orig new file mode 100644 index 00000000..d6eb7f51 --- /dev/null +++ b/openstack/python-neutronclient/centos/python-neutronclient.spec.orig @@ -0,0 +1,233 @@ +%{!?upstream_version: %global upstream_version %{version}%{?milestone}} + +%global sname neutronclient + +%if 0%{?fedora} +%global with_python3 1 +%endif + +%global common_desc \ +Client library and command line utility for interacting with OpenStack \ +Neutron's API. + +Name: python-neutronclient +Version: 6.9.1 +Release: 1%{?dist} +Summary: Python API and CLI for OpenStack Neutron + +License: ASL 2.0 +URL: http://launchpad.net/%{name}/ +Source0: https://tarballs.openstack.org/%{name}/%{name}-%{upstream_version}.tar.gz + +BuildArch: noarch + +Obsoletes: python-%{sname}-tests <= 4.1.1-3 + +%description +%{common_desc} + +%package -n python2-%{sname} +Summary: Python API and CLI for OpenStack Neutron +%{?python_provide:%python_provide python2-neutronclient} + +BuildRequires: git +BuildRequires: openstack-macros +BuildRequires: python2-devel +BuildRequires: python2-setuptools +BuildRequires: python2-pbr +# Required for unit tests +BuildRequires: python2-osc-lib-tests +BuildRequires: python2-oslotest +BuildRequires: python2-testtools +BuildRequires: python2-testrepository +BuildRequires: python2-testscenarios + +Requires: python2-babel >= 2.3.4 +Requires: python2-iso8601 >= 0.1.11 +Requires: python2-os-client-config >= 1.28.0 +Requires: python2-oslo-i18n >= 3.15.3 +Requires: python2-oslo-log >= 3.36.0 +Requires: python2-oslo-serialization >= 2.18.0 +Requires: python2-oslo-utils >= 3.33.0 +Requires: python2-pbr +Requires: python2-requests >= 2.14.2 +Requires: python2-six >= 1.10.0 +Requires: python2-debtcollector >= 1.2.0 +Requires: python2-osc-lib >= 1.10.0 +Requires: python2-keystoneauth1 >= 3.4.0 +Requires: python2-keystoneclient >= 1:3.8.0 +Requires: python2-cliff >= 2.8.0 +%if 0%{?fedora} > 0 +Requires: python2-netaddr >= 0.7.18 +Requires: python2-simplejson >= 3.5.1 +%else +Requires: python-netaddr >= 0.7.18 +Requires: python-simplejson >= 3.5.1 +%endif + +%description -n python2-%{sname} +%{common_desc} + +%package -n python2-%{sname}-tests +Summary: Python API and CLI for OpenStack Neutron - Unit tests +%{?python_provide:%python_provide python2-%{sname}-tests} +Requires: python2-%{sname} == %{version}-%{release} +Requires: python2-osc-lib-tests +Requires: python2-oslotest +Requires: python2-testtools +Requires: python2-testrepository +Requires: python2-testscenarios + +%description -n python2-%{sname}-tests +%{common_desc} + +This package containts the unit tests. + +%if 0%{?with_python3} +%package -n python3-%{sname} +Summary: Python API and CLI for OpenStack Neutron +%{?python_provide:%python_provide python3-neutronclient} + +BuildRequires: python3-devel +BuildRequires: python3-setuptools +BuildRequires: python3-pbr +# Required for unit tests +BuildRequires: python3-osc-lib-tests +BuildRequires: python3-oslotest +BuildRequires: python3-testrepository +BuildRequires: python3-testtools +BuildRequires: python3-testscenarios + +Requires: python3-babel >= 2.3.4 +Requires: python3-cliff >= 2.8.0 +Requires: python3-iso8601 >= 0.1.11 +Requires: python3-netaddr >= 0.7.18 +Requires: python3-os-client-config >= 1.28.0 +Requires: python3-oslo-i18n >= 3.15.3 +Requires: python3-oslo-log >= 3.36.0 +Requires: python3-oslo-serialization >= 2.18.0 +Requires: python3-oslo-utils >= 3.33.0 +Requires: python3-pbr +Requires: python3-requests >= 2.14.2 +Requires: python3-simplejson >= 3.5.1 +Requires: python3-six >= 1.10.0 +Requires: python3-debtcollector >= 1.2.0 +Requires: python3-osc-lib >= 1.10.0 +Requires: python3-keystoneauth1 >= 3.4.0 +Requires: python3-keystoneclient >= 1:3.8.0 + +%description -n python3-%{sname} +%{common_desc} + + +%package -n python3-%{sname}-tests +Summary: Python API and CLI for OpenStack Neutron - Unit tests +%{?python_provide:%python_provide python3-%{sname}-tests} +Requires: python3-%{sname} == %{version}-%{release} +Requires: python3-osc-lib-tests +Requires: python3-oslotest +Requires: python3-testrepository +Requires: python3-testtools +Requires: python3-testscenarios + +%description -n python3-%{sname}-tests +%{common_desc} + +This package containts the unit tests. +%endif + +%package doc +Summary: Documentation for OpenStack Neutron API Client + +BuildRequires: python2-sphinx +BuildRequires: python2-openstackdocstheme +BuildRequires: python2-reno +BuildRequires: python2-keystoneauth1 +BuildRequires: python2-keystoneclient +BuildRequires: python2-os-client-config +BuildRequires: python2-osc-lib +BuildRequires: python2-oslo-serialization +BuildRequires: python2-oslo-utils +BuildRequires: python2-cliff + +%description doc +%{common_desc} + +%prep +%autosetup -n %{name}-%{upstream_version} -S git + +# Let RPM handle the dependencies +%py_req_cleanup + +%build +%py2_build +%if 0%{?with_python3} +%py3_build +%endif + +# Build HTML docs +export PYTHONPATH=. +sphinx-build -W -b html doc/source doc/build/html + +# Fix hidden-file-or-dir warnings +rm -rf doc/build/html/.doctrees doc/build/html/.buildinfo + +%install +%if 0%{?with_python3} +%py3_install +mv %{buildroot}%{_bindir}/neutron %{buildroot}%{_bindir}/neutron-%{python3_version} +ln -s ./neutron-%{python3_version} %{buildroot}%{_bindir}/neutron-3 +%endif + +%py2_install +mv %{buildroot}%{_bindir}/neutron %{buildroot}%{_bindir}/neutron-%{python2_version} +ln -s ./neutron-%{python2_version} %{buildroot}%{_bindir}/neutron-2 +ln -s ./neutron-2 %{buildroot}%{_bindir}/neutron + +%check +# (TODO) Ignore unit tests results until https://bugs.launchpad.net/python-neutronclient/+bug/1783789 +# is fixed. +%{__python2} setup.py testr || true +%if 0%{?with_python3} +rm -rf .testrepository +%{__python3} setup.py testr || true +%endif + +%files -n python2-%{sname} +%doc README.rst +%license LICENSE +%{python2_sitelib}/neutronclient +%{python2_sitelib}/*.egg-info +%{_bindir}/neutron +%{_bindir}/neutron-2 +%{_bindir}/neutron-%{python2_version} +%exclude %{python2_sitelib}/neutronclient/tests + +%files -n python2-%{sname}-tests +%{python2_sitelib}/neutronclient/tests + +%if 0%{?with_python3} +%files -n python3-%{sname} +%license LICENSE +%doc README.rst +%{python3_sitelib}/%{sname} +%{python3_sitelib}/*.egg-info +%{_bindir}/neutron-3 +%{_bindir}/neutron-%{python3_version} +%exclude %{python3_sitelib}/neutronclient/tests + +%files -n python3-%{sname}-tests +%{python3_sitelib}/neutronclient/tests +%endif + +%files doc +%doc doc/build/html +%license LICENSE + +%changelog +* Thu Sep 20 2018 RDO 6.9.1-1 +- Update to 6.9.1 + +* Thu Aug 09 2018 RDO 6.9.0-1 +- Update to 6.9.0 + diff --git a/openstack/python-novaclient/centos/build_srpm.data b/openstack/python-novaclient/centos/build_srpm.data index cde47bcf..b1c697d3 100644 --- a/openstack/python-novaclient/centos/build_srpm.data +++ b/openstack/python-novaclient/centos/build_srpm.data @@ -1,4 +1,3 @@ TAR_NAME=python-novaclient SRC_DIR=$CGCS_BASE/git/python-novaclient -TIS_BASE_SRCREV=a1c00740c5b709a7d2bc4289fa6e28eac7909b8f -TIS_PATCH_VER=GITREVCOUNT +TIS_PATCH_VER=0 diff --git a/openstack/python-novaclient/centos/python-novaclient.spec b/openstack/python-novaclient/centos/python-novaclient.spec index 95fac97b..38459011 100644 --- a/openstack/python-novaclient/centos/python-novaclient.spec +++ b/openstack/python-novaclient/centos/python-novaclient.spec @@ -1,54 +1,56 @@ %{!?upstream_version: %global upstream_version %{version}%{?milestone}} %global sname novaclient +%global with_doc 0 %if 0%{?fedora} %global with_python3 1 %endif +%global common_desc \ +This is a client for the OpenStack Nova API. There's a Python API (the \ +novaclient module), and a command-line script (nova). Each implements 100% of \ +the OpenStack Nova API. + Name: python-novaclient Epoch: 1 -Version: 9.1.1 +Version: 11.0.0 Release: 1%{?_tis_dist}.%{tis_patch_ver} Summary: Python API and CLI for OpenStack Nova License: ASL 2.0 -URL: https://launchpad.net/python-novaclient -Source0: %{name}-%{version}.tar.gz +URL: https://launchpad.net/%{name} +Source0: https://pypi.io/packages/source/p/%{name}/%{name}-%{version}.tar.gz BuildArch: noarch +BuildRequires: git +BuildRequires: openstack-macros + %description -This is a client for the OpenStack Nova API. There's a Python API (the -novaclient module), and a command-line script (nova). Each implements 100% of -the OpenStack Nova API. +%{common_desc} %package -n python2-%{sname} Summary: Python API and CLI for OpenStack Nova %{?python_provide:%python_provide python2-novaclient} BuildRequires: python2-devel -BuildRequires: python-pbr -BuildRequires: git -BuildRequires: python-setuptools +BuildRequires: python2-pbr +BuildRequires: python2-setuptools BuildRequires: python2-pip BuildRequires: python2-wheel -BuildRequires: python-dateutil -Requires: python-babel >= 2.3.4 -Requires: python-iso8601 >= 0.1.11 -Requires: python-keystoneauth1 >= 3.1.0 -Requires: python-oslo-i18n >= 2.1.0 -Requires: python-oslo-serialization >= 1.10.0 -Requires: python-oslo-utils >= 3.20.0 -Requires: python-pbr >= 2.0.0 -Requires: python-prettytable >= 0.7.1 -Requires: python-requests -Requires: python-simplejson >= 2.2.0 -Requires: python-six >= 1.9.0 +Requires: python2-babel >= 2.3.4 +Requires: python2-iso8601 >= 0.1.11 +Requires: python2-keystoneauth1 >= 3.4.0 +Requires: python2-oslo-i18n >= 3.15.3 +Requires: python2-oslo-serialization >= 2.18.0 +Requires: python2-oslo-utils >= 3.33.0 +Requires: python2-pbr >= 2.0.0 +Requires: python2-prettytable >= 0.7.2 +Requires: python-simplejson >= 3.5.1 +Requires: python2-six >= 1.10.0 %description -n python2-%{sname} -This is a client for the OpenStack Nova API. There's a Python API (the -novaclient module), and a command-line script (nova). Each implements 100% of -the OpenStack Nova API. +%{common_desc} %if 0%{?with_python3} %package -n python3-%{sname} @@ -61,50 +63,42 @@ BuildRequires: python3-setuptools Requires: python3-babel >= 2.3.4 Requires: python3-iso8601 >= 0.1.11 -Requires: python3-keystoneauth1 >= 3.1.0 -Requires: python3-oslo-i18n >= 2.1.0 -Requires: python3-oslo-serialization >= 1.10.0 -Requires: python3-oslo-utils >= 3.20.0 +Requires: python3-keystoneauth1 >= 3.4.0 +Requires: python3-oslo-i18n >= 3.15.3 +Requires: python3-oslo-serialization >= 2.18.0 +Requires: python3-oslo-utils >= 3.33.0 Requires: python3-pbr >= 2.0.0 -Requires: python3-prettytable >= 0.7.1 -Requires: python3-requests -Requires: python3-simplejson >= 2.2.0 -Requires: python3-six >= 1.9.0 +Requires: python3-prettytable >= 0.7.2 +Requires: python3-simplejson >= 3.5.1 +Requires: python3-six >= 1.10.0 %description -n python3-%{sname} -This is a client for the OpenStack Nova API. There's a Python API (the -novaclient module), and a command-line script (nova). Each implements 100% of -the OpenStack Nova API. +%{common_desc} %endif +%if 0%{?with_doc} %package doc Summary: Documentation for OpenStack Nova API Client -BuildRequires: python-sphinx -BuildRequires: python-openstackdocstheme -BuildRequires: python-oslo-utils -BuildRequires: python-keystoneauth1 -BuildRequires: python-oslo-serialization -BuildRequires: python-prettytable +BuildRequires: python2-sphinx +BuildRequires: python2-openstackdocstheme +BuildRequires: python2-oslo-utils +BuildRequires: python2-keystoneauth1 +BuildRequires: python2-oslo-serialization +BuildRequires: python2-prettytable +BuildRequires: python2-sphinxcontrib-apidoc %description doc -This is a client for the OpenStack Nova API. There's a Python API (the -novaclient module), and a command-line script (nova). Each implements 100% of -the OpenStack Nova API. +%{common_desc} This package contains auto-generated documentation. - -%package sdk -Summary: SDK files for %{name} - -%description sdk -Contains SDK files for %{name} package +%endif %prep %autosetup -n %{name}-%{upstream_version} -S git # Let RPM handle the requirements -rm -f test-requirements.txt +%py_req_cleanup %build export PBR_VERSION=%{version} @@ -128,9 +122,6 @@ rm -fr %{buildroot}%{python3_sitelib}/novaclient/tests mv %{buildroot}%{_bindir}/nova %{buildroot}%{_bindir}/nova-%{python2_version} ln -s ./nova-%{python2_version} %{buildroot}%{_bindir}/nova-2 -mkdir -p $RPM_BUILD_ROOT/wheels -install -m 644 dist/*.whl $RPM_BUILD_ROOT/wheels/ - ln -s ./nova-2 %{buildroot}%{_bindir}/nova mkdir -p %{buildroot}%{_sysconfdir}/bash_completion.d @@ -140,25 +131,34 @@ install -pm 644 tools/nova.bash_completion \ # Delete tests rm -fr %{buildroot}%{python2_sitelib}/novaclient/tests +%if 0%{?with_doc} %{__python2} setup.py build_sphinx -b html -%{__python2} setup.py build_sphinx -b man - +# generate man page +sphinx-build -b man doc/source doc/build/man install -p -D -m 644 doc/build/man/nova.1 %{buildroot}%{_mandir}/man1/nova.1 # Fix hidden-file-or-dir warnings rm -fr doc/build/html/.doctrees doc/build/html/.buildinfo +%endif + + +mkdir -p $RPM_BUILD_ROOT/wheels +install -m 644 dist/*.whl $RPM_BUILD_ROOT/wheels/ # prep SDK package mkdir -p %{buildroot}/usr/share/remote-clients/%{name} tar zcf %{buildroot}/usr/share/remote-clients/%{name}/%{name}-%{version}.tgz --exclude='.gitignore' --exclude='.gitreview' -C .. %{name}-%{version} + %files -n python2-%{sname} %license LICENSE %doc README.rst %{python2_sitelib}/%{sname} %{python2_sitelib}/*.egg-info %{_sysconfdir}/bash_completion.d +%if 0%{?with_doc} %{_mandir}/man1/nova.1.gz +%endif %{_bindir}/nova %{_bindir}/nova-2 %{_bindir}/nova-%{python2_version} @@ -171,14 +171,24 @@ tar zcf %{buildroot}/usr/share/remote-clients/%{name}/%{name}-%{version}.tgz --e %{python3_sitelib}/%{sname} %{python3_sitelib}/*.egg-info %{_sysconfdir}/bash_completion.d +%if 0%{?with_doc} %{_mandir}/man1/nova.1.gz +%endif %{_bindir}/nova-3 %{_bindir}/nova-%{python3_version} %endif +%if 0%{?with_doc} %files doc %doc doc/build/html %license LICENSE +%endif + +%package sdk +Summary: SDK files for %{name} + +%description sdk +Contains SDK files for %{name} package %files sdk /usr/share/remote-clients/%{name}/%{name}-%{version}.tgz @@ -192,10 +202,8 @@ Contains python wheels for %{name} %files wheels /wheels/* + %changelog -* Fri Oct 06 2017 rdo-trunk 1:9.1.1-1 -- Update to 9.1.1 - -* Mon Aug 14 2017 Alfredo Moralejo 1:9.1.0-1 -- Update to 9.1.0 +* Thu Aug 09 2018 RDO 1:11.0.0-1 +- Update to 11.0.0 diff --git a/openstack/python-novaclient/centos/python-novaclient.spec.orig b/openstack/python-novaclient/centos/python-novaclient.spec.orig new file mode 100644 index 00000000..e4955dd2 --- /dev/null +++ b/openstack/python-novaclient/centos/python-novaclient.spec.orig @@ -0,0 +1,164 @@ +%{!?upstream_version: %global upstream_version %{version}%{?milestone}} + +%global sname novaclient + +%if 0%{?fedora} +%global with_python3 1 +%endif + +%global common_desc \ +This is a client for the OpenStack Nova API. There's a Python API (the \ +novaclient module), and a command-line script (nova). Each implements 100% of \ +the OpenStack Nova API. + +Name: python-novaclient +Epoch: 1 +Version: 11.0.0 +Release: 1%{?dist} +Summary: Python API and CLI for OpenStack Nova +License: ASL 2.0 +URL: https://launchpad.net/%{name} +Source0: https://pypi.io/packages/source/p/%{name}/%{name}-%{version}.tar.gz +BuildArch: noarch + +BuildRequires: git +BuildRequires: openstack-macros + +%description +%{common_desc} + +%package -n python2-%{sname} +Summary: Python API and CLI for OpenStack Nova +%{?python_provide:%python_provide python2-novaclient} + +BuildRequires: python2-devel +BuildRequires: python2-pbr +BuildRequires: python2-setuptools + +Requires: python2-babel >= 2.3.4 +Requires: python2-iso8601 >= 0.1.11 +Requires: python2-keystoneauth1 >= 3.4.0 +Requires: python2-oslo-i18n >= 3.15.3 +Requires: python2-oslo-serialization >= 2.18.0 +Requires: python2-oslo-utils >= 3.33.0 +Requires: python2-pbr >= 2.0.0 +Requires: python2-prettytable >= 0.7.2 +Requires: python-simplejson >= 3.5.1 +Requires: python2-six >= 1.10.0 + +%description -n python2-%{sname} +%{common_desc} + +%if 0%{?with_python3} +%package -n python3-%{sname} +Summary: Python API and CLI for OpenStack Nova +%{?python_provide:%python_provide python3-novaclient} + +BuildRequires: python3-devel +BuildRequires: python3-pbr +BuildRequires: python3-setuptools + +Requires: python3-babel >= 2.3.4 +Requires: python3-iso8601 >= 0.1.11 +Requires: python3-keystoneauth1 >= 3.4.0 +Requires: python3-oslo-i18n >= 3.15.3 +Requires: python3-oslo-serialization >= 2.18.0 +Requires: python3-oslo-utils >= 3.33.0 +Requires: python3-pbr >= 2.0.0 +Requires: python3-prettytable >= 0.7.2 +Requires: python3-simplejson >= 3.5.1 +Requires: python3-six >= 1.10.0 + +%description -n python3-%{sname} +%{common_desc} +%endif + +%package doc +Summary: Documentation for OpenStack Nova API Client + +BuildRequires: python2-sphinx +BuildRequires: python2-openstackdocstheme +BuildRequires: python2-oslo-utils +BuildRequires: python2-keystoneauth1 +BuildRequires: python2-oslo-serialization +BuildRequires: python2-prettytable + +%description doc +%{common_desc} + +This package contains auto-generated documentation. + +%prep +%autosetup -n %{name}-%{upstream_version} -S git + +# Let RPM handle the requirements +%py_req_cleanup + +%build +%py2_build +%if 0%{?with_python3} +%py3_build +%endif + +%install +%if 0%{?with_python3} +%py3_install +mv %{buildroot}%{_bindir}/nova %{buildroot}%{_bindir}/nova-%{python3_version} +ln -s ./nova-%{python3_version} %{buildroot}%{_bindir}/nova-3 +# Delete tests +rm -fr %{buildroot}%{python3_sitelib}/novaclient/tests +%endif + +%py2_install +mv %{buildroot}%{_bindir}/nova %{buildroot}%{_bindir}/nova-%{python2_version} +ln -s ./nova-%{python2_version} %{buildroot}%{_bindir}/nova-2 + +ln -s ./nova-2 %{buildroot}%{_bindir}/nova + +mkdir -p %{buildroot}%{_sysconfdir}/bash_completion.d +install -pm 644 tools/nova.bash_completion \ + %{buildroot}%{_sysconfdir}/bash_completion.d/nova + +# Delete tests +rm -fr %{buildroot}%{python2_sitelib}/novaclient/tests + +%{__python2} setup.py build_sphinx -b html +%{__python2} setup.py build_sphinx -b man + +install -p -D -m 644 doc/build/man/nova.1 %{buildroot}%{_mandir}/man1/nova.1 + +# Fix hidden-file-or-dir warnings +rm -fr doc/build/html/.doctrees doc/build/html/.buildinfo + +%files -n python2-%{sname} +%license LICENSE +%doc README.rst +%{python2_sitelib}/%{sname} +%{python2_sitelib}/*.egg-info +%{_sysconfdir}/bash_completion.d +%{_mandir}/man1/nova.1.gz +%{_bindir}/nova +%{_bindir}/nova-2 +%{_bindir}/nova-%{python2_version} + + +%if 0%{?with_python3} +%files -n python3-%{sname} +%license LICENSE +%doc README.rst +%{python3_sitelib}/%{sname} +%{python3_sitelib}/*.egg-info +%{_sysconfdir}/bash_completion.d +%{_mandir}/man1/nova.1.gz +%{_bindir}/nova-3 +%{_bindir}/nova-%{python3_version} +%endif + +%files doc +%doc doc/build/html +%license LICENSE + +%changelog +* Thu Aug 09 2018 RDO 1:11.0.0-1 +- Update to 11.0.0 + diff --git a/openstack/python-openstackclient/centos/build_srpm.data b/openstack/python-openstackclient/centos/build_srpm.data index c1f01e47..e1a5865a 100644 --- a/openstack/python-openstackclient/centos/build_srpm.data +++ b/openstack/python-openstackclient/centos/build_srpm.data @@ -1 +1,4 @@ -TIS_PATCH_VER=18 +TAR_NAME=python-openstackclient +SRC_DIR="$CGCS_BASE/git/python-openstackclient" +COPY_LIST="$DISTRO/patches/*" +TIS_PATCH_VER=1 diff --git a/openstack/python-openstackclient/centos/meta_patches/0001-Update-package-versioning-for-TIS-format.patch b/openstack/python-openstackclient/centos/meta_patches/0001-Update-package-versioning-for-TIS-format.patch deleted file mode 100644 index c7feff5c..00000000 --- a/openstack/python-openstackclient/centos/meta_patches/0001-Update-package-versioning-for-TIS-format.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/SPECS/python-openstackclient.spec b/SPECS/python-openstackclient.spec -index 62817fd..2c25c75 100644 ---- a/SPECS/python-openstackclient.spec -+++ b/SPECS/python-openstackclient.spec -@@ -10,7 +10,7 @@ - - Name: python-openstackclient - Version: 3.12.1 --Release: 1%{?dist} -+Release: 1.el7%{?_tis_dist}.%{tis_patch_ver} - Summary: OpenStack Command-line Client - - License: ASL 2.0 diff --git a/openstack/python-openstackclient/centos/meta_patches/0002-spec-remote-clients-sdk.patch b/openstack/python-openstackclient/centos/meta_patches/0002-spec-remote-clients-sdk.patch deleted file mode 100644 index faa7ebe3..00000000 --- a/openstack/python-openstackclient/centos/meta_patches/0002-spec-remote-clients-sdk.patch +++ /dev/null @@ -1,45 +0,0 @@ -diff --git a/SPECS/python-openstackclient.spec b/SPECS/python-openstackclient.spec -index 2c25c75..874e8a4 100644 ---- a/SPECS/python-openstackclient.spec -+++ b/SPECS/python-openstackclient.spec -@@ -162,6 +162,13 @@ It is a thin wrapper to the stock python-*client modules that implement the - actual REST API client actions. - %endif - -+%package sdk -+Summary: SDK files for %{name} -+ -+%description sdk -+Contains SDK files for %{name} package -+ -+ - %prep - %autosetup -n %{name}-%{upstream_version} -S git - -@@ -206,6 +213,12 @@ mv %{buildroot}%{python2_sitelib}/openstackclient/locale %{buildroot}%{_datadir} - rm -rf %{buildroot}%{python3_sitelib}/openstackclient/locale - %endif - -+ -+# prep SDK package -+mkdir -p %{buildroot}/usr/share/remote-clients/%{name} -+tar zcf %{buildroot}/usr/share/remote-clients/%{name}/%{name}-%{version}.tgz --exclude='.gitignore' --exclude='.gitreview' -C .. %{name}-%{version} -+ -+ - # Find language files - %find_lang openstackclient --all-name - -@@ -242,6 +255,10 @@ rm -rf .testrepository - %{python3_sitelib}/openstackclient - %{python3_sitelib}/*.egg-info - %endif -+ -+%files sdk -+/usr/share/remote-clients/%{name}/%{name}-%{version}.tgz -+ - %changelog - * Tue Apr 03 2018 RDO 3.12.1-1 - - Update to 3.12.1 --- -1.8.3.1 - diff --git a/openstack/python-openstackclient/centos/meta_patches/0003-meta-dont-remove-requirements-txt.patch b/openstack/python-openstackclient/centos/meta_patches/0003-meta-dont-remove-requirements-txt.patch deleted file mode 100644 index a2ab1217..00000000 --- a/openstack/python-openstackclient/centos/meta_patches/0003-meta-dont-remove-requirements-txt.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/SPECS/python-openstackclient.spec b/SPECS/python-openstackclient.spec -index 874e8a4..8cea3b8 100644 ---- a/SPECS/python-openstackclient.spec -+++ b/SPECS/python-openstackclient.spec -@@ -173,7 +173,7 @@ Contains SDK files for %{name} package - %autosetup -n %{name}-%{upstream_version} -S git - - # We handle requirements ourselves, pkg_resources only bring pain --rm -rf requirements.txt test-requirements.txt -+rm -rf test-requirements.txt - - %build - %py2_build diff --git a/openstack/python-openstackclient/centos/meta_patches/0004-added-missing-build-require-dateutil.patch b/openstack/python-openstackclient/centos/meta_patches/0004-added-missing-build-require-dateutil.patch deleted file mode 100644 index 1ba5a430..00000000 --- a/openstack/python-openstackclient/centos/meta_patches/0004-added-missing-build-require-dateutil.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff --git a/SPECS/python-openstackclient.spec b/SPECS/python-openstackclient.spec -index 8cea3b8..dbb1daa 100644 ---- a/SPECS/python-openstackclient.spec -+++ b/SPECS/python-openstackclient.spec -@@ -59,6 +59,7 @@ BuildRequires: python-reno - BuildRequires: python-requestsexceptions - BuildRequires: python-openstacksdk - BuildRequires: python-osprofiler -+BuildRequires: python-dateutil - - Requires: python-pbr - Requires: python-babel diff --git a/openstack/python-openstackclient/centos/meta_patches/0005-meta-patch-for-neutron-extensions.patch b/openstack/python-openstackclient/centos/meta_patches/0005-meta-patch-for-neutron-extensions.patch deleted file mode 100644 index d248296f..00000000 --- a/openstack/python-openstackclient/centos/meta_patches/0005-meta-patch-for-neutron-extensions.patch +++ /dev/null @@ -1,14 +0,0 @@ -diff --git a/SPECS/python-openstackclient.spec b/SPECS/python-openstackclient.spec -index dbb1daa..3ef7f0d 100644 ---- a/SPECS/python-openstackclient.spec -+++ b/SPECS/python-openstackclient.spec -@@ -17,6 +17,9 @@ License: ASL 2.0 - URL: http://github.com/openstack/%{name} - Source0: https://tarballs.openstack.org/%{name}/%{name}-%{upstream_version}.tar.gz - -+# WRS patches -+Patch0001: 0001-neutron-extensions.patch -+ - BuildArch: noarch - - %description diff --git a/openstack/python-openstackclient/centos/meta_patches/0006-openstackClient_Passwordchange_warning.patch b/openstack/python-openstackclient/centos/meta_patches/0006-openstackClient_Passwordchange_warning.patch deleted file mode 100644 index fc3f3b25..00000000 --- a/openstack/python-openstackclient/centos/meta_patches/0006-openstackClient_Passwordchange_warning.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff --git a/SPECS/python-openstackclient.spec b/SPECS/python-openstackclient.spec -index 3ef7f0d..9f624f1 100644 ---- a/SPECS/python-openstackclient.spec -+++ b/SPECS/python-openstackclient.spec -@@ -19,6 +19,7 @@ Source0: https://tarballs.openstack.org/%{name}/%{name}-%{upstream_vers - - # WRS patches - Patch0001: 0001-neutron-extensions.patch -+Patch0002: openstackClient_Passwordchange_warning.patch - - BuildArch: noarch - diff --git a/openstack/python-openstackclient/centos/meta_patches/0007-CGTS-7814-warning-only-when-the-admin-password-chang.patch b/openstack/python-openstackclient/centos/meta_patches/0007-CGTS-7814-warning-only-when-the-admin-password-chang.patch deleted file mode 100644 index d054e184..00000000 --- a/openstack/python-openstackclient/centos/meta_patches/0007-CGTS-7814-warning-only-when-the-admin-password-chang.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff --git a/SPECS/python-openstackclient.spec b/SPECS/python-openstackclient.spec -index 9f624f1..4791547 100644 ---- a/SPECS/python-openstackclient.spec -+++ b/SPECS/python-openstackclient.spec -@@ -20,6 +20,7 @@ Source0: https://tarballs.openstack.org/%{name}/%{name}-%{upstream_vers - # WRS patches - Patch0001: 0001-neutron-extensions.patch - Patch0002: openstackClient_Passwordchange_warning.patch -+Patch0003: CGTS-7814-warning-only-when-the-admin-password-chang.patch - - BuildArch: noarch - diff --git a/openstack/python-openstackclient/centos/meta_patches/0008-CGTS-7947-add-os-keystone-region-name-to-identity-cl.patch b/openstack/python-openstackclient/centos/meta_patches/0008-CGTS-7947-add-os-keystone-region-name-to-identity-cl.patch deleted file mode 100644 index 539cbbbd..00000000 --- a/openstack/python-openstackclient/centos/meta_patches/0008-CGTS-7947-add-os-keystone-region-name-to-identity-cl.patch +++ /dev/null @@ -1,25 +0,0 @@ -From bf24d1a99d29ab66feb4b2c7c7e5839e1cc23ec3 Mon Sep 17 00:00:00 2001 -From: Andy Ning -Date: Thu, 2 Nov 2017 10:45:40 -0400 -Subject: CGTS-7947: add --os-keystone-region-name to identity client - -Signed-off-by: Andy Ning ---- - SPECS/python-openstackclient.spec | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/SPECS/python-openstackclient.spec b/SPECS/python-openstackclient.spec -index 4791547..5d3d7b4 100644 ---- a/SPECS/python-openstackclient.spec -+++ b/SPECS/python-openstackclient.spec -@@ -21,6 +21,7 @@ Source0: https://tarballs.openstack.org/%{name}/%{name}-%{upstream_vers - Patch0001: 0001-neutron-extensions.patch - Patch0002: openstackClient_Passwordchange_warning.patch - Patch0003: CGTS-7814-warning-only-when-the-admin-password-chang.patch -+Patch0004: 0001-CGTS-7947-add-os-keystone-region-name-to-identity-cl.patch - - BuildArch: noarch - --- -2.7.4 - diff --git a/openstack/python-openstackclient/centos/meta_patches/1000-remove-version-requirements.patch b/openstack/python-openstackclient/centos/meta_patches/1000-remove-version-requirements.patch deleted file mode 100644 index d60d7361..00000000 --- a/openstack/python-openstackclient/centos/meta_patches/1000-remove-version-requirements.patch +++ /dev/null @@ -1,33 +0,0 @@ -diff --git a/SPECS/python-openstackclient.spec b/SPECS/python-openstackclient.spec -index 5d3d7b4..44dd46b 100644 ---- a/SPECS/python-openstackclient.spec -+++ b/SPECS/python-openstackclient.spec -@@ -70,17 +70,17 @@ BuildRequires: python-dateutil - Requires: python-pbr - Requires: python-babel - Requires: python-cliff --Requires: python-openstacksdk >= 0.9.17 --Requires: python-oslo-i18n >= 2.1.0 --Requires: python-oslo-utils >= 3.20.0 --Requires: python-glanceclient >= 1:2.8.0 --Requires: python-keystoneauth1 >= 3.1.0 --Requires: python-keystoneclient >= 1:3.8.0 --Requires: python-novaclient >= 1:9.0.0 --Requires: python-cinderclient >= 3.1.0 --Requires: python-neutronclient >= 6.3.0 --Requires: python-six >= 1.9.0 --Requires: python-osc-lib >= 1.7.0 -+Requires: python-openstacksdk -+Requires: python-oslo-i18n -+Requires: python-oslo-utils -+Requires: python-glanceclient -+Requires: python-keystoneauth1 -+Requires: python-keystoneclient -+Requires: python-novaclient -+Requires: python-cinderclient -+Requires: python-neutronclient -+Requires: python-six -+Requires: python-osc-lib - Requires: python-%{client}-lang = %{version}-%{release} - - diff --git a/openstack/python-openstackclient/centos/meta_patches/1001-Turn-off-openstackclient-check.patch b/openstack/python-openstackclient/centos/meta_patches/1001-Turn-off-openstackclient-check.patch deleted file mode 100644 index 9259f160..00000000 --- a/openstack/python-openstackclient/centos/meta_patches/1001-Turn-off-openstackclient-check.patch +++ /dev/null @@ -1,36 +0,0 @@ -From 18d4d4009e230d6d0b820496d210641ab79802af Mon Sep 17 00:00:00 2001 -From: Al Bailey -Date: Thu, 19 Oct 2017 14:19:56 -0500 -Subject: Turn off openstackclient check - ---- - SPECS/python-openstackclient.spec | 13 +++++++------ - 1 file changed, 7 insertions(+), 6 deletions(-) - -diff --git a/SPECS/python-openstackclient.spec b/SPECS/python-openstackclient.spec -index 44dd46b..9bca398 100644 ---- a/SPECS/python-openstackclient.spec -+++ b/SPECS/python-openstackclient.spec -@@ -229,12 +229,13 @@ tar zcf %{buildroot}/usr/share/remote-clients/%{name}/%{name}-%{version}.tgz --e - # Find language files - %find_lang openstackclient --all-name - --%check --%{__python2} setup.py test --%if 0%{?with_python3} --rm -rf .testrepository --%{__python3} setup.py test --%endif -+# WRS disable check. -+#%check -+#%{__python2} setup.py test -+#%if 0%{?with_python3} -+#rm -rf .testrepository -+#%{__python3} setup.py test -+#%endif - - %files -n python2-%{client} - %license LICENSE --- -2.7.4 - diff --git a/openstack/python-openstackclient/centos/meta_patches/1002-meta-us101470.patch b/openstack/python-openstackclient/centos/meta_patches/1002-meta-us101470.patch deleted file mode 100644 index b2f3cd4a..00000000 --- a/openstack/python-openstackclient/centos/meta_patches/1002-meta-us101470.patch +++ /dev/null @@ -1,24 +0,0 @@ -From 47de75f37476e81f627222417e652ac77b2a17ab Mon Sep 17 00:00:00 2001 -From: Sen Yang -Date: Wed, 20 Dec 2017 23:53:02 -0500 -Subject: [PATCH 1/1] meta us101470 - ---- - SPECS/python-openstackclient.spec | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/SPECS/python-openstackclient.spec b/SPECS/python-openstackclient.spec -index 9bca398..3e184a9 100644 ---- a/SPECS/python-openstackclient.spec -+++ b/SPECS/python-openstackclient.spec -@@ -22,6 +22,7 @@ Patch0001: 0001-neutron-extensions.patch - Patch0002: openstackClient_Passwordchange_warning.patch - Patch0003: CGTS-7814-warning-only-when-the-admin-password-chang.patch - Patch0004: 0001-CGTS-7947-add-os-keystone-region-name-to-identity-cl.patch -+Patch0005: 0001-US101470-Openstackclient-implementation-of-novaclien.patch - - BuildArch: noarch - --- -1.8.3.1 - diff --git a/openstack/python-openstackclient/centos/meta_patches/1003-meta-us101470.patch b/openstack/python-openstackclient/centos/meta_patches/1003-meta-us101470.patch deleted file mode 100644 index 31974e51..00000000 --- a/openstack/python-openstackclient/centos/meta_patches/1003-meta-us101470.patch +++ /dev/null @@ -1,24 +0,0 @@ -From c330094f36df9e38c497d6cbfb03574e6ad368a0 Mon Sep 17 00:00:00 2001 -From: Sen Yang -Date: Fri, 5 Jan 2018 15:25:06 -0500 -Subject: [PATCH 1/1] US101470 part2 - ---- - SPECS/python-openstackclient.spec | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/SPECS/python-openstackclient.spec b/SPECS/python-openstackclient.spec -index 3e184a9..1cf210a 100644 ---- a/SPECS/python-openstackclient.spec -+++ b/SPECS/python-openstackclient.spec -@@ -23,6 +23,7 @@ Patch0002: openstackClient_Passwordchange_warning.patch - Patch0003: CGTS-7814-warning-only-when-the-admin-password-chang.patch - Patch0004: 0001-CGTS-7947-add-os-keystone-region-name-to-identity-cl.patch - Patch0005: 0001-US101470-Openstackclient-implementation-of-novaclien.patch -+Patch0006: 0002-US101470-Openstackclient-implementation-of-novaclien.patch - - BuildArch: noarch - --- -1.8.3.1 - diff --git a/openstack/python-openstackclient/centos/meta_patches/1004-meta-US106901-Openstack-CLI-Adoption.patch b/openstack/python-openstackclient/centos/meta_patches/1004-meta-US106901-Openstack-CLI-Adoption.patch deleted file mode 100644 index fba542e5..00000000 --- a/openstack/python-openstackclient/centos/meta_patches/1004-meta-US106901-Openstack-CLI-Adoption.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 12504bfa15db581d310f3e059b5c8dce0df1be9f Mon Sep 17 00:00:00 2001 -From: Sen Yang -Date: Thu, 1 Feb 2018 12:05:55 -0500 -Subject: [PATCH 1/1] US106901 Openstack-CLI-Adoption for - Glance/Cinder/Ceilometer - ---- - SPECS/python-openstackclient.spec | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/SPECS/python-openstackclient.spec b/SPECS/python-openstackclient.spec -index 1cf210a..6774444 100644 ---- a/SPECS/python-openstackclient.spec -+++ b/SPECS/python-openstackclient.spec -@@ -24,6 +24,7 @@ Patch0003: CGTS-7814-warning-only-when-the-admin-password-chang.patch - Patch0004: 0001-CGTS-7947-add-os-keystone-region-name-to-identity-cl.patch - Patch0005: 0001-US101470-Openstackclient-implementation-of-novaclien.patch - Patch0006: 0002-US101470-Openstackclient-implementation-of-novaclien.patch -+Patch0007: 0001-US106901-Openstack-CLI-Adoption.patch - - BuildArch: noarch - --- -1.8.3.1 - diff --git a/openstack/python-openstackclient/centos/meta_patches/1005-meta-US106901-Openstack-CLI-Adoption.patch b/openstack/python-openstackclient/centos/meta_patches/1005-meta-US106901-Openstack-CLI-Adoption.patch deleted file mode 100644 index 2ea5be5d..00000000 --- a/openstack/python-openstackclient/centos/meta_patches/1005-meta-US106901-Openstack-CLI-Adoption.patch +++ /dev/null @@ -1,25 +0,0 @@ -From ddf5ea208a3ba122558e355fe8535bcba024d2c8 Mon Sep 17 00:00:00 2001 -From: Sen Yang -Date: Mon, 5 Feb 2018 15:37:29 -0500 -Subject: [PATCH 1/1] US106901 Openstack CLI Adoption: Cinder/Glance/Ceilometer - - CI part2 ---- - SPECS/python-openstackclient.spec | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/SPECS/python-openstackclient.spec b/SPECS/python-openstackclient.spec -index 6774444..4b1682e 100644 ---- a/SPECS/python-openstackclient.spec -+++ b/SPECS/python-openstackclient.spec -@@ -25,6 +25,7 @@ Patch0004: 0001-CGTS-7947-add-os-keystone-region-name-to-identity-cl.patc - Patch0005: 0001-US101470-Openstackclient-implementation-of-novaclien.patch - Patch0006: 0002-US101470-Openstackclient-implementation-of-novaclien.patch - Patch0007: 0001-US106901-Openstack-CLI-Adoption.patch -+Patch0008: 0002-US106901-Openstack-CLI-Adoption.patch - - BuildArch: noarch - --- -1.8.3.1 - diff --git a/openstack/python-openstackclient/centos/meta_patches/1006-meta-patch-for-endpoint-groups.patch b/openstack/python-openstackclient/centos/meta_patches/1006-meta-patch-for-endpoint-groups.patch deleted file mode 100644 index a57a060d..00000000 --- a/openstack/python-openstackclient/centos/meta_patches/1006-meta-patch-for-endpoint-groups.patch +++ /dev/null @@ -1,26 +0,0 @@ -From ac2faa010188a6d824a8958c2971bcefe2a56ab9 Mon Sep 17 00:00:00 2001 -From: Angie Wang -Date: Fri, 8 Jun 2018 16:05:52 -0400 -Subject: [PATCH] meta patch for endpoint groups - ---- - SPECS/python-openstackclient.spec | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/SPECS/python-openstackclient.spec b/SPECS/python-openstackclient.spec -index 4b1682e..c192b2b 100644 ---- a/SPECS/python-openstackclient.spec -+++ b/SPECS/python-openstackclient.spec -@@ -26,6 +26,9 @@ Patch0005: 0001-US101470-Openstackclient-implementation-of-novaclien.patc - Patch0006: 0002-US101470-Openstackclient-implementation-of-novaclien.patch - Patch0007: 0001-US106901-Openstack-CLI-Adoption.patch - Patch0008: 0002-US106901-Openstack-CLI-Adoption.patch -+Patch0009: 0001-Optimize-getting-endpoint-list.patch -+Patch0010: 0002-Add-support-for-endpoing-filter-commands.patch -+Patch0011: 0003-Add-support-for-endpoint-group-commands.patch - - BuildArch: noarch - --- -1.8.3.1 - diff --git a/openstack/python-openstackclient/centos/meta_patches/1007-Allow-setting-wrs-binding-vif_model-using-osclient.patch b/openstack/python-openstackclient/centos/meta_patches/1007-Allow-setting-wrs-binding-vif_model-using-osclient.patch deleted file mode 100644 index 0c48f53e..00000000 --- a/openstack/python-openstackclient/centos/meta_patches/1007-Allow-setting-wrs-binding-vif_model-using-osclient.patch +++ /dev/null @@ -1,23 +0,0 @@ -From 15a676bb74150546db8425ecae4976fb773661a0 Mon Sep 17 00:00:00 2001 -From: Joseph Richard -Date: Tue, 25 Sep 2018 14:57:06 -0400 -Subject: [PATCH 16/16] Allow setting wrs-binding:vif_model using osclient - ---- - SPECS/python-openstackclient.spec | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/SPECS/python-openstackclient.spec b/SPECS/python-openstackclient.spec -index c192b2b..29fec53 100644 ---- a/SPECS/python-openstackclient.spec -+++ b/SPECS/python-openstackclient.spec -@@ -29,6 +29,7 @@ Patch0008: 0002-US106901-Openstack-CLI-Adoption.patch - Patch0009: 0001-Optimize-getting-endpoint-list.patch - Patch0010: 0002-Add-support-for-endpoing-filter-commands.patch - Patch0011: 0003-Add-support-for-endpoint-group-commands.patch -+Patch0012: 0001-Allow-setting-wrs-binding-vif_model-using-osclient.patch - - BuildArch: noarch - --- -1.8.3.1 diff --git a/openstack/python-openstackclient/centos/meta_patches/1008-Remove-wrs-binding-mac_filtering-and-setting-extensi.patch b/openstack/python-openstackclient/centos/meta_patches/1008-Remove-wrs-binding-mac_filtering-and-setting-extensi.patch deleted file mode 100644 index 5581becb..00000000 --- a/openstack/python-openstackclient/centos/meta_patches/1008-Remove-wrs-binding-mac_filtering-and-setting-extensi.patch +++ /dev/null @@ -1,24 +0,0 @@ -From 6cf8ebc9e09035d49cfb051c4c4b03c4b8607ba3 Mon Sep 17 00:00:00 2001 -From: Teresa Ho -Date: Tue, 30 Oct 2018 11:16:53 -0400 -Subject: [PATCH] Remove wrs-binding:mac_filtering and setting extension - ---- - SPECS/python-openstackclient.spec | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/SPECS/python-openstackclient.spec b/SPECS/python-openstackclient.spec -index 29fec53..3dd52cb 100644 ---- a/SPECS/python-openstackclient.spec -+++ b/SPECS/python-openstackclient.spec -@@ -30,6 +30,7 @@ Patch0009: 0001-Optimize-getting-endpoint-list.patch - Patch0010: 0002-Add-support-for-endpoing-filter-commands.patch - Patch0011: 0003-Add-support-for-endpoint-group-commands.patch - Patch0012: 0001-Allow-setting-wrs-binding-vif_model-using-osclient.patch -+Patch0013: 0001-Remove-wrs-binding-mac_filtering-and-setting-extensi.patch - - BuildArch: noarch - --- -1.8.3.1 - diff --git a/openstack/python-openstackclient/centos/meta_patches/PATCH_ORDER b/openstack/python-openstackclient/centos/meta_patches/PATCH_ORDER deleted file mode 100644 index 250eada2..00000000 --- a/openstack/python-openstackclient/centos/meta_patches/PATCH_ORDER +++ /dev/null @@ -1,17 +0,0 @@ -0001-Update-package-versioning-for-TIS-format.patch -0002-spec-remote-clients-sdk.patch -0003-meta-dont-remove-requirements-txt.patch -0004-added-missing-build-require-dateutil.patch -0005-meta-patch-for-neutron-extensions.patch -0006-openstackClient_Passwordchange_warning.patch -0007-CGTS-7814-warning-only-when-the-admin-password-chang.patch -0008-CGTS-7947-add-os-keystone-region-name-to-identity-cl.patch -1000-remove-version-requirements.patch -1001-Turn-off-openstackclient-check.patch -1002-meta-us101470.patch -1003-meta-us101470.patch -1004-meta-US106901-Openstack-CLI-Adoption.patch -1005-meta-US106901-Openstack-CLI-Adoption.patch -1006-meta-patch-for-endpoint-groups.patch -1007-Allow-setting-wrs-binding-vif_model-using-osclient.patch -1008-Remove-wrs-binding-mac_filtering-and-setting-extensi.patch diff --git a/openstack/python-openstackclient/centos/patches/0001-Add-network-segment-range-command-object.patch b/openstack/python-openstackclient/centos/patches/0001-Add-network-segment-range-command-object.patch new file mode 100644 index 00000000..61e7ec45 --- /dev/null +++ b/openstack/python-openstackclient/centos/patches/0001-Add-network-segment-range-command-object.patch @@ -0,0 +1,1488 @@ +From c61224f6227585819c313072133bb5a15ca8957d Mon Sep 17 00:00:00 2001 +From: Kailun Qin +Date: Tue, 25 Dec 2018 07:20:59 +0800 +Subject: [PATCH] Add network segment range command object + +Add network segment range command object in support of network segment +range management. + +This patch set includes documentation, unit tests and functional tests +(currently skipped unit network segment range enabled in Neutron by +default) for the following new commands: + - "os network segment range create" + - "os network segment range delete" + - "os network segment range list" + - "os network segment range set" + - "os network segment range show" + +Co-authored-by: Allain Legacy + +Partially-implements: blueprint network-segment-range-management +Change-Id: I335692f2db5be07c1c164f09b13f1abb80b7ba33 +Depends-on: https://review.openstack.org/624708 +Depends-on: https://review.openstack.org/624709 +--- + +diff --git a/doc/source/cli/command-objects/network_segment_range.rst b/doc/source/cli/command-objects/network_segment_range.rst +new file mode 100644 +index 0000000..31fabbf +--- /dev/null ++++ b/doc/source/cli/command-objects/network_segment_range.rst +@@ -0,0 +1,168 @@ ++===================== ++network segment range ++===================== ++ ++A **network segment range** is a resource for tenant network segment ++allocation. ++A network segment range exposes the segment range management to be administered ++via the Neutron API. In addition, it introduces the ability for the ++administrator to control the segment ranges globally or on a per-tenant basis. ++ ++Network v2 ++ ++network segment range create ++---------------------------- ++ ++Create new network segment range ++ ++.. program:: network segment range create ++.. code:: bash ++ ++ openstack network segment range create ++ (--private | --shared) ++ [--project [--project-domain ]] ++ --network-type ++ [--physical-network ] ++ --minimum ++ --maximum ++ ++ ++.. option:: --private ++ ++ Network segment range is assigned specifically to the project ++ ++.. option:: --shared ++ ++ Network segment range is shared with other projects ++ ++.. option:: --project ++ ++ Network segment range owner (name or ID). Optional when the segment ++ range is shared ++ ++.. option:: --project-domain ++ ++ Domain the project belongs to (name or ID). ++ This can be used in case collisions between project names exist. ++ ++.. option:: --physical-network ++ ++ Physical network name of this network segment range ++ ++.. option:: --network-type ++ ++ Network type of this network segment range ++ (geneve, gre, vlan or vxlan) ++ ++.. option:: --minimum ++ ++ Minimum segment identifier for this network segment range which is based ++ on the network type, VLAN ID for vlan network type and tunnel ID for ++ geneve, gre and vxlan network types ++ ++.. option:: --maximum ++ ++ Maximum segment identifier for this network segment range which is based ++ on the network type, VLAN ID for vlan network type and tunnel ID for ++ geneve, gre and vxlan network types ++ ++.. _network_segment_range_create-name: ++.. describe:: ++ ++ Name of new network segment range ++ ++network segment range delete ++---------------------------- ++ ++Delete network segment range(s) ++ ++.. program:: network segment range delete ++.. code:: bash ++ ++ openstack network segment range delete ++ [ ...] ++ ++.. _network_segment_range_delete-network-segment-range: ++.. describe:: ++ ++ Network segment range (s) to delete (name or ID) ++ ++network segment range list ++-------------------------- ++ ++List network segment ranges ++ ++.. program:: network segment range list ++.. code:: bash ++ ++ openstack network segment range list ++ [--long] ++ [--used | --unused] ++ [--available | --unavailable] ++ ++.. option:: --long ++ ++ List additional fields in output ++ ++.. option:: --used ++ ++ List network segment ranges that have segments not in use ++ ++.. option:: --unused ++ ++ List network segment ranges that do not have segments not in use ++ ++.. option:: --available ++ ++ List network segment ranges that have available segments ++ ++.. option:: --unavailable ++ ++ List network segment ranges without available segments ++ ++network segment range set ++------------------------- ++ ++Set network segment range properties ++ ++.. program:: network segment range set ++.. code:: bash ++ ++ openstack network segment range set ++ [--name ] ++ [--minimum ] ++ [--maximum ] ++ ++ ++.. option:: --name ++ ++ Set network segment range name ++ ++.. option:: --minimum ++ ++ Set network segment range minimum segment identifier ++ ++.. option:: --maximum ++ ++ Set network segment range maximum segment identifier ++ ++.. _network_segment_range_set-network-segment-range: ++.. describe:: ++ ++ Network segment range to modify (name or ID) ++ ++network segment range show ++-------------------------- ++ ++Display network segment range details ++ ++.. program:: network segment range show ++.. code:: bash ++ ++ openstack network segment range show ++ ++ ++.. _network_segment_range_show-network-segment-range: ++.. describe:: ++ ++ Network segment range to display (name or ID) +diff --git a/doc/source/cli/commands.rst b/doc/source/cli/commands.rst +index cdd5e63..e302fda 100644 +--- a/doc/source/cli/commands.rst ++++ b/doc/source/cli/commands.rst +@@ -125,6 +125,7 @@ + * ``network qos policy``: (**Network**) - a QoS policy for network resources + * ``network qos rule type``: (**Network**) - list of QoS available rule types + * ``network segment``: (**Network**) - a segment of a virtual network ++* ``network segment range``: (**Network**) - a segment range for tenant network segment allocation + * ``network service provider``: (**Network**) - a driver providing a network service + * ``object``: (**Object Storage**) a single file in the Object Storage + * ``object store account``: (**Object Storage**) owns a group of Object Storage resources +diff --git a/openstackclient/network/v2/network_segment_range.py b/openstackclient/network/v2/network_segment_range.py +new file mode 100644 +index 0000000..9e5e2e9 +--- /dev/null ++++ b/openstackclient/network/v2/network_segment_range.py +@@ -0,0 +1,450 @@ ++# Copyright (c) 2018, Intel Corporation. ++# All Rights Reserved. ++# ++# 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. ++# ++ ++"""Network segment action implementations""" ++ ++import itertools ++import logging ++ ++from osc_lib.command import command ++from osc_lib import exceptions ++from osc_lib import utils ++import six ++ ++from openstackclient.i18n import _ ++from openstackclient.identity import common as identity_common ++from openstackclient.network import sdk_utils ++ ++ ++LOG = logging.getLogger(__name__) ++ ++ ++def _get_columns(item): ++ return sdk_utils.get_osc_show_columns_for_sdk_resource(item, {}) ++ ++ ++def _get_ranges(item): ++ item = [int(i) if isinstance(i, six.string_types) else i for i in item] ++ for a, b in itertools.groupby(enumerate(item), lambda xy: xy[1] - xy[0]): ++ b = list(b) ++ yield "%s-%s" % (b[0][1], b[-1][1]) if b[0][1] != b[-1][1] else \ ++ str(b[0][1]) ++ ++ ++def _hack_tuple_value_update_by_index(tup, index, value): ++ lot = list(tup) ++ lot[index] = value ++ return tuple(lot) ++ ++ ++def _is_prop_empty(columns, props, prop_name): ++ return True if not props[columns.index(prop_name)] else False ++ ++ ++def _exchange_dict_keys_with_values(orig_dict): ++ updated_dict = dict() ++ for k, v in six.iteritems(orig_dict): ++ k = [k] ++ if not updated_dict.get(v): ++ updated_dict[v] = k ++ else: ++ updated_dict[v].extend(k) ++ return updated_dict ++ ++ ++def _update_available_from_props(columns, props): ++ index_available = columns.index('available') ++ props = _hack_tuple_value_update_by_index( ++ props, index_available, list(_get_ranges(props[index_available]))) ++ return props ++ ++ ++def _update_used_from_props(columns, props): ++ index_used = columns.index('used') ++ updated_used = _exchange_dict_keys_with_values(props[index_used]) ++ for k, v in six.iteritems(updated_used): ++ updated_used[k] = list(_get_ranges(v)) ++ props = _hack_tuple_value_update_by_index( ++ props, index_used, updated_used) ++ return props ++ ++ ++def _update_additional_fields_from_props(columns, props): ++ props = _update_available_from_props(columns, props) ++ props = _update_used_from_props(columns, props) ++ return props ++ ++ ++class CreateNetworkSegmentRange(command.ShowOne): ++ _description = _("Create new network segment range") ++ ++ def get_parser(self, prog_name): ++ parser = super(CreateNetworkSegmentRange, self).get_parser(prog_name) ++ shared_group = parser.add_mutually_exclusive_group(required=True) ++ shared_group.add_argument( ++ "--private", ++ dest="private", ++ action="store_true", ++ help=_('Network segment range is assigned specifically to the ' ++ 'project'), ++ ) ++ shared_group.add_argument( ++ "--shared", ++ dest="shared", ++ action="store_true", ++ help=_('Network segment range is shared with other projects'), ++ ) ++ parser.add_argument( ++ 'name', ++ metavar='', ++ help=_('Name of new network segment range') ++ ) ++ parser.add_argument( ++ '--project', ++ metavar='', ++ help=_('Network segment range owner (name or ID). Optional when ' ++ 'the segment range is shared'), ++ ) ++ identity_common.add_project_domain_option_to_parser(parser) ++ parser.add_argument( ++ '--network-type', ++ metavar='', ++ choices=['geneve', 'gre', 'vlan', 'vxlan'], ++ required=True, ++ help=_('Network type of this network segment range ' ++ '(geneve, gre, vlan or vxlan)'), ++ ) ++ parser.add_argument( ++ '--physical-network', ++ metavar='', ++ help=_('Physical network name of this network segment range'), ++ ) ++ parser.add_argument( ++ '--minimum', ++ metavar='', ++ type=int, ++ required=True, ++ help=_('Minimum segment identifier for this network segment ' ++ 'range which is based on the network type, VLAN ID for ' ++ 'vlan network type and tunnel ID for geneve, gre and vxlan ' ++ 'network types'), ++ ) ++ parser.add_argument( ++ '--maximum', ++ metavar='', ++ type=int, ++ required=True, ++ help=_('Maximum segment identifier for this network segment ' ++ 'range which is based on the network type, VLAN ID for ' ++ 'vlan network type and tunnel ID for geneve, gre and vxlan ' ++ 'network types'), ++ ) ++ ++ return parser ++ ++ def take_action(self, parsed_args): ++ network_client = self.app.client_manager.network ++ try: ++ # Verify that the extension exists. ++ network_client.find_extension('network-segment-range', ++ ignore_missing=False) ++ except Exception as e: ++ msg = (_('Network segment range create not supported by ' ++ 'Network API: %(e)s') % {'e': e}) ++ raise exceptions.CommandError(msg) ++ ++ identity_client = self.app.client_manager.identity ++ ++ if parsed_args.shared and parsed_args.project: ++ msg = _("--project is only allowed with --private") ++ raise exceptions.CommandError(msg) ++ ++ if parsed_args.private and not parsed_args.project: ++ msg = _("--project is required with --private") ++ raise exceptions.CommandError(msg) ++ ++ if (parsed_args.network_type.lower() != 'vlan' and ++ parsed_args.physical_network): ++ msg = _("--physical-network is only allowed with --network-type " ++ "vlan") ++ raise exceptions.CommandError(msg) ++ ++ attrs = {} ++ attrs['shared'] = parsed_args.shared ++ attrs['network_type'] = parsed_args.network_type ++ attrs['minimum'] = parsed_args.minimum ++ attrs['maximum'] = parsed_args.maximum ++ if parsed_args.name: ++ attrs['name'] = parsed_args.name ++ ++ if parsed_args.project: ++ project_id = identity_common.find_project( ++ identity_client, ++ parsed_args.project, ++ parsed_args.project_domain, ++ ).id ++ if project_id: ++ attrs['project_id'] = project_id ++ else: ++ msg = (_("Failed to create the network segment range for " ++ "project %(project_id)s") % parsed_args.project_id) ++ raise exceptions.CommandError(msg) ++ if parsed_args.physical_network: ++ attrs['physical_network'] = parsed_args.physical_network ++ obj = network_client.create_network_segment_range(**attrs) ++ display_columns, columns = _get_columns(obj) ++ data = utils.get_item_properties(obj, columns) ++ data = _update_additional_fields_from_props(columns, props=data) ++ return (display_columns, data) ++ ++ ++class DeleteNetworkSegmentRange(command.Command): ++ _description = _("Delete network segment range(s)") ++ ++ def get_parser(self, prog_name): ++ parser = super(DeleteNetworkSegmentRange, self).get_parser(prog_name) ++ parser.add_argument( ++ 'network_segment_range', ++ metavar='', ++ nargs='+', ++ help=_('Network segment range(s) to delete (name or ID)'), ++ ) ++ return parser ++ ++ def take_action(self, parsed_args): ++ network_client = self.app.client_manager.network ++ try: ++ # Verify that the extension exists. ++ network_client.find_extension('network-segment-range', ++ ignore_missing=False) ++ except Exception as e: ++ msg = (_('Network segment range delete not supported by ' ++ 'Network API: %(e)s') % {'e': e}) ++ raise exceptions.CommandError(msg) ++ ++ result = 0 ++ for network_segment_range in parsed_args.network_segment_range: ++ try: ++ obj = network_client.find_network_segment_range( ++ network_segment_range, ignore_missing=False) ++ network_client.delete_network_segment_range(obj) ++ except Exception as e: ++ result += 1 ++ LOG.error(_("Failed to delete network segment range with " ++ "ID '%(network_segment_range)s': %(e)s"), ++ {'network_segment_range': network_segment_range, ++ 'e': e}) ++ ++ if result > 0: ++ total = len(parsed_args.network_segment_range) ++ msg = (_("%(result)s of %(total)s network segment ranges failed " ++ "to delete.") % {'result': result, 'total': total}) ++ raise exceptions.CommandError(msg) ++ ++ ++class ListNetworkSegmentRange(command.Lister): ++ _description = _("List network segment ranges") ++ ++ def get_parser(self, prog_name): ++ parser = super(ListNetworkSegmentRange, self).get_parser(prog_name) ++ parser.add_argument( ++ '--long', ++ action='store_true', ++ help=_('List additional fields in output'), ++ ) ++ used_group = parser.add_mutually_exclusive_group() ++ used_group.add_argument( ++ '--used', ++ action='store_true', ++ help=_('List network segment ranges that have segments in use'), ++ ) ++ used_group.add_argument( ++ '--unused', ++ action='store_true', ++ help=_('List network segment ranges that have segments ' ++ 'not in use'), ++ ) ++ available_group = parser.add_mutually_exclusive_group() ++ available_group.add_argument( ++ '--available', ++ action='store_true', ++ help=_('List network segment ranges that have available segments'), ++ ) ++ available_group.add_argument( ++ '--unavailable', ++ action='store_true', ++ help=_('List network segment ranges without available segments'), ++ ) ++ return parser ++ ++ def take_action(self, parsed_args): ++ network_client = self.app.client_manager.network ++ try: ++ # Verify that the extension exists. ++ network_client.find_extension('network-segment-range', ++ ignore_missing=False) ++ except Exception as e: ++ msg = (_('Network segment ranges list not supported by ' ++ 'Network API: %(e)s') % {'e': e}) ++ raise exceptions.CommandError(msg) ++ ++ filters = {} ++ data = network_client.network_segment_ranges(**filters) ++ ++ headers = ( ++ 'ID', ++ 'Name', ++ 'Default', ++ 'Shared', ++ 'Project ID', ++ 'Network Type', ++ 'Physical Network', ++ 'Minimum ID', ++ 'Maximum ID' ++ ) ++ columns = ( ++ 'id', ++ 'name', ++ 'default', ++ 'shared', ++ 'project_id', ++ 'network_type', ++ 'physical_network', ++ 'minimum', ++ 'maximum', ++ ) ++ if parsed_args.available or parsed_args.unavailable or \ ++ parsed_args.used or parsed_args.unused: ++ # If one of `--available`, `--unavailable`, `--used`, ++ # `--unused` is specified, we assume that additional fields ++ # should be listed in output. ++ parsed_args.long = True ++ if parsed_args.long: ++ headers = headers + ( ++ 'Used', ++ 'Available', ++ ) ++ columns = columns + ( ++ 'used', ++ 'available', ++ ) ++ ++ display_props = tuple() ++ for s in data: ++ props = utils.get_item_properties(s, columns) ++ if parsed_args.available and \ ++ _is_prop_empty(columns, props, 'available') or \ ++ parsed_args.unavailable and \ ++ not _is_prop_empty(columns, props, 'available') or \ ++ parsed_args.used and _is_prop_empty(columns, props, 'used') or \ ++ parsed_args.unused and \ ++ not _is_prop_empty(columns, props, 'used'): ++ continue ++ if parsed_args.long: ++ props = _update_additional_fields_from_props(columns, props) ++ display_props += (props,) ++ ++ return headers, display_props ++ ++ ++class SetNetworkSegmentRange(command.Command): ++ _description = _("Set network segment range properties") ++ ++ def get_parser(self, prog_name): ++ parser = super(SetNetworkSegmentRange, self).get_parser(prog_name) ++ parser.add_argument( ++ 'network_segment_range', ++ metavar='', ++ help=_('Network segment range to modify (name or ID)'), ++ ) ++ parser.add_argument( ++ '--name', ++ metavar='', ++ help=_('Set network segment name'), ++ ) ++ parser.add_argument( ++ '--minimum', ++ metavar='', ++ type=int, ++ help=_('Set network segment range minimum segment identifier'), ++ ) ++ parser.add_argument( ++ '--maximum', ++ metavar='', ++ type=int, ++ help=_('Set network segment range maximum segment identifier'), ++ ) ++ return parser ++ ++ def take_action(self, parsed_args): ++ network_client = self.app.client_manager.network ++ try: ++ # Verify that the extension exists. ++ network_client.find_extension('network-segment-range', ++ ignore_missing=False) ++ except Exception as e: ++ msg = (_('Network segment range set not supported by ' ++ 'Network API: %(e)s') % {'e': e}) ++ raise exceptions.CommandError(msg) ++ ++ if (parsed_args.minimum and not parsed_args.maximum) or \ ++ (parsed_args.maximum and not parsed_args.minimum): ++ msg = _("--minimum and --maximum are both required") ++ raise exceptions.CommandError(msg) ++ ++ obj = network_client.find_network_segment_range( ++ parsed_args.network_segment_range, ignore_missing=False) ++ attrs = {} ++ if parsed_args.name: ++ attrs['name'] = parsed_args.name ++ if parsed_args.minimum: ++ attrs['minimum'] = parsed_args.minimum ++ if parsed_args.maximum: ++ attrs['maximum'] = parsed_args.maximum ++ network_client.update_network_segment_range(obj, **attrs) ++ ++ ++class ShowNetworkSegmentRange(command.ShowOne): ++ _description = _("Display network segment range details") ++ ++ def get_parser(self, prog_name): ++ parser = super(ShowNetworkSegmentRange, self).get_parser(prog_name) ++ parser.add_argument( ++ 'network_segment_range', ++ metavar='', ++ help=_('Network segment range to display (name or ID)'), ++ ) ++ return parser ++ ++ def take_action(self, parsed_args): ++ network_client = self.app.client_manager.network ++ try: ++ # Verify that the extension exists. ++ network_client.find_extension('network-segment-range', ++ ignore_missing=False) ++ except Exception as e: ++ msg = (_('Network segment range show not supported by ' ++ 'Network API: %(e)s') % {'e': e}) ++ raise exceptions.CommandError(msg) ++ ++ obj = network_client.find_network_segment_range( ++ parsed_args.network_segment_range, ++ ignore_missing=False ++ ) ++ display_columns, columns = _get_columns(obj) ++ data = utils.get_item_properties(obj, columns) ++ data = _update_additional_fields_from_props(columns, props=data) ++ return (display_columns, data) +diff --git a/openstackclient/tests/functional/network/v2/test_network_segment_range.py b/openstackclient/tests/functional/network/v2/test_network_segment_range.py +new file mode 100644 +index 0000000..435cbe1 +--- /dev/null ++++ b/openstackclient/tests/functional/network/v2/test_network_segment_range.py +@@ -0,0 +1,152 @@ ++# Copyright (c) 2018, Intel Corporation. ++# All Rights Reserved. ++# ++# 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 json ++import uuid ++ ++import testtools ++ ++from openstackclient.tests.functional.network.v2 import common ++ ++ ++# NOTE(kailun): Network segment range management is still a WIP and not ++# enabled by default. ++@testtools.skip("bp/network-segment-range-management") ++class NetworkSegmentRangeTests(common.NetworkTests): ++ """Functional tests for network segment range""" ++ ++ PROJECT_NAME = uuid.uuid4().hex ++ ++ @classmethod ++ def setUpClass(cls): ++ super(NetworkSegmentRangeTests, cls).setUpClass() ++ # Make a project ++ cmd_output = json.loads(cls.openstack( ++ "project create -f json --enable " + cls.PROJECT_NAME ++ )) ++ cls.project_id = cmd_output["id"] ++ ++ @classmethod ++ def tearDownClass(cls): ++ try: ++ raw_output = cls.openstack("project delete " + cls.PROJECT_NAME) ++ cls.assertOutput('', raw_output) ++ finally: ++ super(NetworkSegmentRangeTests, cls).tearDownClass() ++ ++ def setUp(self): ++ super(NetworkSegmentRangeTests, self).setUp() ++ # Nothing in this class works with Nova Network ++ if not self.haz_network: ++ self.skipTest("No Network service present") ++ ++ def test_network_segment_range_create_delete(self): ++ name = uuid.uuid4().hex ++ json_output = json.loads(self.openstack( ++ ' network segment range create -f json ' + ++ '--private ' + ++ "--project " + self.PROJECT_NAME + " " + ++ '--network-type vxlan ' + ++ '--minimum 2018 ' + ++ '--maximum 2055 ' + ++ name ++ )) ++ self.assertEqual( ++ name, ++ json_output["name"], ++ ) ++ self.assertEqual( ++ self.project_id, ++ json_output["project_id"], ++ ) ++ ++ raw_output = self.openstack( ++ 'network segment range delete ' + name, ++ ) ++ self.assertOutput('', raw_output) ++ ++ def test_network_segment_range_list(self): ++ name = uuid.uuid4().hex ++ json_output = json.loads(self.openstack( ++ ' network segment range create -f json ' + ++ '--shared ' + ++ '--network-type geneve ' + ++ '--minimum 2018 ' + ++ '--maximum 2055 ' + ++ name ++ )) ++ network_segment_range_id = json_output.get('id') ++ network_segment_range_name = json_output.get('name') ++ self.addCleanup( ++ self.openstack, ++ 'network segment range delete ' + network_segment_range_id ++ ) ++ self.assertEqual( ++ name, ++ json_output["name"], ++ ) ++ ++ json_output = json.loads(self.openstack( ++ 'network segment list -f json' ++ )) ++ item_map = { ++ item.get('ID'): item.get('Name') for item in json_output ++ } ++ self.assertIn(network_segment_range_id, item_map.keys()) ++ self.assertIn(network_segment_range_name, item_map.values()) ++ ++ def test_network_segment_range_set_show(self): ++ name = uuid.uuid4().hex ++ json_output = json.loads(self.openstack( ++ ' network segment range create -f json ' + ++ '--private ' + ++ "--project " + self.PROJECT_NAME + " " + ++ '--network-type geneve ' + ++ '--minimum 2018 ' + ++ '--maximum 2055 ' + ++ name ++ )) ++ self.addCleanup( ++ self.openstack, ++ 'network segment range delete ' + name ++ ) ++ self.assertEqual( ++ name, ++ json_output["name"], ++ ) ++ ++ new_minimum = '2010' ++ new_maximum = '2060' ++ cmd_output = self.openstack( ++ 'network segment range set ' + ++ '--minimum ' + new_minimum + ' ' + ++ '--maximum ' + new_maximum + ' ' + ++ name ++ ) ++ self.assertOutput('', cmd_output) ++ ++ json_output = json.loads(self.openstack( ++ 'network segment range show -f json ' + ++ name ++ )) ++ self.assertEqual( ++ new_minimum, ++ json_output["minimum"], ++ ) ++ self.assertEqual( ++ new_maximum, ++ json_output["maximum"], ++ ) +diff --git a/openstackclient/tests/unit/network/v2/fakes.py b/openstackclient/tests/unit/network/v2/fakes.py +index 28e92d1..2397cc5 100644 +--- a/openstackclient/tests/unit/network/v2/fakes.py ++++ b/openstackclient/tests/unit/network/v2/fakes.py +@@ -538,6 +538,66 @@ + return network_segments + + ++class FakeNetworkSegmentRange(object): ++ """Fake one or more network segment ranges.""" ++ ++ @staticmethod ++ def create_one_network_segment_range(attrs=None): ++ """Create a fake network segment range. ++ ++ :param Dictionary attrs: ++ A dictionary with all attributes ++ :return: ++ A FakeResource object faking the network segment range ++ """ ++ attrs = attrs or {} ++ ++ # Set default attributes. ++ fake_uuid = uuid.uuid4().hex ++ network_segment_range_attrs = { ++ 'id': 'network-segment-range-id-' + fake_uuid, ++ 'name': 'network-segment-name-' + fake_uuid, ++ 'default': False, ++ 'shared': False, ++ 'project_id': 'project-id-' + fake_uuid, ++ 'network_type': 'vlan', ++ 'physical_network': 'physical-network-name-' + fake_uuid, ++ 'minimum': 64, ++ 'maximum': 256, ++ 'used': {104: '3312e4ba67864b2eb53f3f41432f8efc', ++ 106: '3312e4ba67864b2eb53f3f41432f8efc'}, ++ 'available': [100, 101, 102, 103, 105], ++ } ++ ++ # Overwrite default attributes. ++ network_segment_range_attrs.update(attrs) ++ ++ network_segment_range = fakes.FakeResource( ++ info=copy.deepcopy(network_segment_range_attrs), ++ loaded=True ++ ) ++ ++ return network_segment_range ++ ++ @staticmethod ++ def create_network_segment_ranges(attrs=None, count=2): ++ """Create multiple fake network segment ranges. ++ ++ :param Dictionary attrs: ++ A dictionary with all attributes ++ :param int count: ++ The number of network segment ranges to fake ++ :return: ++ A list of FakeResource objects faking the network segment ranges ++ """ ++ network_segment_ranges = [] ++ for i in range(0, count): ++ network_segment_ranges.append( ++ FakeNetworkSegmentRange.create_one_network_segment_range(attrs) ++ ) ++ return network_segment_ranges ++ ++ + class FakePort(object): + """Fake one or more ports.""" + +diff --git a/openstackclient/tests/unit/network/v2/test_network_segment_range.py b/openstackclient/tests/unit/network/v2/test_network_segment_range.py +new file mode 100644 +index 0000000..bb2b302 +--- /dev/null ++++ b/openstackclient/tests/unit/network/v2/test_network_segment_range.py +@@ -0,0 +1,557 @@ ++# Copyright (c) 2018, Intel Corporation. ++# All Rights Reserved. ++# ++# 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 mock ++from mock import call ++ ++from osc_lib import exceptions ++ ++from openstackclient.network.v2 import network_segment_range ++from openstackclient.tests.unit.network.v2 import fakes as network_fakes ++from openstackclient.tests.unit import utils as tests_utils ++ ++ ++class TestNetworkSegmentRange(network_fakes.TestNetworkV2): ++ ++ def setUp(self): ++ super(TestNetworkSegmentRange, self).setUp() ++ ++ # Get a shortcut to the network client ++ self.network = self.app.client_manager.network ++ ++ ++class TestCreateNetworkSegmentRange(TestNetworkSegmentRange): ++ ++ # The network segment range to create. ++ _network_segment_range = network_fakes.FakeNetworkSegmentRange.\ ++ create_one_network_segment_range() ++ ++ columns = ( ++ 'available', ++ 'default', ++ 'id', ++ 'maximum', ++ 'minimum', ++ 'name', ++ 'network_type', ++ 'physical_network', ++ 'project_id', ++ 'shared', ++ 'used', ++ ) ++ ++ data = ( ++ ['100-103', '105'], ++ _network_segment_range.default, ++ _network_segment_range.id, ++ _network_segment_range.maximum, ++ _network_segment_range.minimum, ++ _network_segment_range.name, ++ _network_segment_range.network_type, ++ _network_segment_range.physical_network, ++ _network_segment_range.project_id, ++ _network_segment_range.shared, ++ {'3312e4ba67864b2eb53f3f41432f8efc': ['104', '106']}, ++ ) ++ ++ def setUp(self): ++ super(TestCreateNetworkSegmentRange, self).setUp() ++ ++ self.network.find_extension = mock.Mock() ++ self.network.create_network_segment_range = mock.Mock( ++ return_value=self._network_segment_range ++ ) ++ ++ # Get the command object to test ++ self.cmd = network_segment_range.CreateNetworkSegmentRange( ++ self.app, ++ self.namespace ++ ) ++ ++ def test_create_no_options(self): ++ # Missing required args should bail here ++ self.assertRaises(tests_utils.ParserException, self.check_parser, ++ self.cmd, [], []) ++ ++ def test_create_invalid_network_type(self): ++ arglist = [ ++ '--private', ++ '--project', self._network_segment_range.project_id, ++ '--network-type', 'foo', ++ '--minimum', str(self._network_segment_range.minimum), ++ '--maximum', str(self._network_segment_range.maximum), ++ self._network_segment_range.name, ++ ] ++ self.assertRaises(tests_utils.ParserException, self.check_parser, ++ self.cmd, arglist, []) ++ ++ def test_create_shared_with_project_id(self): ++ arglist = [ ++ '--shared', ++ '--project', self._network_segment_range.project_id, ++ '--network-type', 'vxlan', ++ '--minimum', str(self._network_segment_range.minimum), ++ '--maximum', str(self._network_segment_range.maximum), ++ self._network_segment_range.name, ++ ] ++ verifylist = [ ++ ('shared', True), ++ ('project', self._network_segment_range.project_id), ++ ('network_type', 'vxlan'), ++ ('minimum', self._network_segment_range.minimum), ++ ('maximum', self._network_segment_range.maximum), ++ ('name', self._network_segment_range.name), ++ ] ++ ++ parsed_args = self.check_parser(self.cmd, arglist, verifylist) ++ self.assertRaises(exceptions.CommandError, ++ self.cmd.take_action, ++ parsed_args) ++ ++ def test_create_non_shared_with_no_project_id(self): ++ arglist = [ ++ '--private', ++ '--network-type', 'vxlan', ++ '--minimum', str(self._network_segment_range.minimum), ++ '--maximum', str(self._network_segment_range.maximum), ++ self._network_segment_range.name, ++ ] ++ verifylist = [ ++ ('shared', self._network_segment_range.shared), ++ ('network_type', 'vxlan'), ++ ('minimum', self._network_segment_range.minimum), ++ ('maximum', self._network_segment_range.maximum), ++ ('name', self._network_segment_range.name), ++ ] ++ ++ parsed_args = self.check_parser(self.cmd, arglist, verifylist) ++ self.assertRaises(exceptions.CommandError, ++ self.cmd.take_action, ++ parsed_args) ++ ++ def test_create_tunnel_with_physical_network(self): ++ arglist = [ ++ '--shared', ++ '--network-type', 'vxlan', ++ '--physical-network', self._network_segment_range.physical_network, ++ '--minimum', str(self._network_segment_range.minimum), ++ '--maximum', str(self._network_segment_range.maximum), ++ self._network_segment_range.name, ++ ] ++ verifylist = [ ++ ('shared', True), ++ ('network_type', 'vxlan'), ++ ('physical_network', self._network_segment_range.physical_network), ++ ('minimum', self._network_segment_range.minimum), ++ ('maximum', self._network_segment_range.maximum), ++ ('name', self._network_segment_range.name), ++ ] ++ ++ parsed_args = self.check_parser(self.cmd, arglist, verifylist) ++ self.assertRaises(exceptions.CommandError, ++ self.cmd.take_action, ++ parsed_args) ++ ++ def test_create_minimum_options(self): ++ arglist = [ ++ '--private', ++ '--project', self._network_segment_range.project_id, ++ '--network-type', self._network_segment_range.network_type, ++ '--minimum', str(self._network_segment_range.minimum), ++ '--maximum', str(self._network_segment_range.maximum), ++ self._network_segment_range.name, ++ ] ++ verifylist = [ ++ ('shared', self._network_segment_range.shared), ++ ('project', self._network_segment_range.project_id), ++ ('network_type', self._network_segment_range.network_type), ++ ('minimum', self._network_segment_range.minimum), ++ ('maximum', self._network_segment_range.maximum), ++ ('name', self._network_segment_range.name), ++ ] ++ ++ parsed_args = self.check_parser(self.cmd, arglist, verifylist) ++ columns, data = self.cmd.take_action(parsed_args) ++ ++ self.network.create_network_segment_range.assert_called_once_with(**{ ++ 'shared': self._network_segment_range.shared, ++ 'project_id': mock.ANY, ++ 'network_type': self._network_segment_range.network_type, ++ 'minimum': self._network_segment_range.minimum, ++ 'maximum': self._network_segment_range.maximum, ++ 'name': self._network_segment_range.name, ++ }) ++ ++ self.assertEqual(self.columns, columns) ++ self.assertEqual(self.data, data) ++ ++ def test_create_all_options(self): ++ arglist = [ ++ '--private', ++ '--project', self._network_segment_range.project_id, ++ '--network-type', self._network_segment_range.network_type, ++ '--physical-network', self._network_segment_range.physical_network, ++ '--minimum', str(self._network_segment_range.minimum), ++ '--maximum', str(self._network_segment_range.maximum), ++ self._network_segment_range.name, ++ ] ++ verifylist = [ ++ ('shared', self._network_segment_range.shared), ++ ('project', self._network_segment_range.project_id), ++ ('network_type', self._network_segment_range.network_type), ++ ('physical_network', self._network_segment_range.physical_network), ++ ('minimum', self._network_segment_range.minimum), ++ ('maximum', self._network_segment_range.maximum), ++ ('name', self._network_segment_range.name), ++ ] ++ ++ parsed_args = self.check_parser(self.cmd, arglist, verifylist) ++ columns, data = self.cmd.take_action(parsed_args) ++ ++ self.network.create_network_segment_range.assert_called_once_with(**{ ++ 'shared': self._network_segment_range.shared, ++ 'project_id': mock.ANY, ++ 'network_type': self._network_segment_range.network_type, ++ 'physical_network': self._network_segment_range.physical_network, ++ 'minimum': self._network_segment_range.minimum, ++ 'maximum': self._network_segment_range.maximum, ++ 'name': self._network_segment_range.name, ++ }) ++ ++ self.assertEqual(self.columns, columns) ++ self.assertEqual(self.data, data) ++ ++ ++class TestDeleteNetworkSegmentRange(TestNetworkSegmentRange): ++ ++ # The network segment ranges to delete. ++ _network_segment_ranges = \ ++ network_fakes.FakeNetworkSegmentRange.create_network_segment_ranges() ++ ++ def setUp(self): ++ super(TestDeleteNetworkSegmentRange, self).setUp() ++ ++ self.network.find_extension = mock.Mock() ++ self.network.delete_network_segment_range = mock.Mock( ++ return_value=None) ++ self.network.find_network_segment_range = mock.Mock( ++ side_effect=self._network_segment_ranges ++ ) ++ ++ # Get the command object to test ++ self.cmd = network_segment_range.DeleteNetworkSegmentRange( ++ self.app, ++ self.namespace ++ ) ++ ++ def test_delete(self): ++ arglist = [ ++ self._network_segment_ranges[0].id, ++ ] ++ verifylist = [ ++ ('network_segment_range', [self._network_segment_ranges[0].id]), ++ ] ++ parsed_args = self.check_parser(self.cmd, arglist, verifylist) ++ ++ result = self.cmd.take_action(parsed_args) ++ ++ self.network.delete_network_segment_range.assert_called_once_with( ++ self._network_segment_ranges[0] ++ ) ++ self.assertIsNone(result) ++ ++ def test_delete_multiple(self): ++ arglist = [] ++ for _network_segment_range in self._network_segment_ranges: ++ arglist.append(_network_segment_range.id) ++ verifylist = [ ++ ('network_segment_range', arglist), ++ ] ++ parsed_args = self.check_parser(self.cmd, arglist, verifylist) ++ ++ result = self.cmd.take_action(parsed_args) ++ ++ calls = [] ++ for _network_segment_range in self._network_segment_ranges: ++ calls.append(call(_network_segment_range)) ++ self.network.delete_network_segment_range.assert_has_calls(calls) ++ self.assertIsNone(result) ++ ++ def test_delete_multiple_with_exception(self): ++ arglist = [ ++ self._network_segment_ranges[0].id, ++ 'doesnotexist' ++ ] ++ verifylist = [ ++ ('network_segment_range', ++ [self._network_segment_ranges[0].id, 'doesnotexist']), ++ ] ++ parsed_args = self.check_parser(self.cmd, arglist, verifylist) ++ ++ find_mock_result = [self._network_segment_ranges[0], ++ exceptions.CommandError] ++ self.network.find_network_segment_range = ( ++ mock.Mock(side_effect=find_mock_result) ++ ) ++ ++ try: ++ self.cmd.take_action(parsed_args) ++ self.fail('CommandError should be raised.') ++ except exceptions.CommandError as e: ++ self.assertEqual('1 of 2 network segment ranges failed to delete.', ++ str(e)) ++ ++ self.network.find_network_segment_range.assert_any_call( ++ self._network_segment_ranges[0].id, ignore_missing=False) ++ self.network.find_network_segment_range.assert_any_call( ++ 'doesnotexist', ignore_missing=False) ++ self.network.delete_network_segment_range.assert_called_once_with( ++ self._network_segment_ranges[0] ++ ) ++ ++ ++class TestListNetworkSegmentRange(TestNetworkSegmentRange): ++ _network_segment_ranges = network_fakes.FakeNetworkSegmentRange.\ ++ create_network_segment_ranges(count=3) ++ ++ columns = ( ++ 'ID', ++ 'Name', ++ 'Default', ++ 'Shared', ++ 'Project ID', ++ 'Network Type', ++ 'Physical Network', ++ 'Minimum ID', ++ 'Maximum ID' ++ ) ++ columns_long = columns + ( ++ 'Used', ++ 'Available', ++ ) ++ ++ data = [] ++ for _network_segment_range in _network_segment_ranges: ++ data.append(( ++ _network_segment_range.id, ++ _network_segment_range.name, ++ _network_segment_range.default, ++ _network_segment_range.shared, ++ _network_segment_range.project_id, ++ _network_segment_range.network_type, ++ _network_segment_range.physical_network, ++ _network_segment_range.minimum, ++ _network_segment_range.maximum, ++ )) ++ ++ data_long = [] ++ for _network_segment_range in _network_segment_ranges: ++ data_long.append(( ++ _network_segment_range.id, ++ _network_segment_range.name, ++ _network_segment_range.default, ++ _network_segment_range.shared, ++ _network_segment_range.project_id, ++ _network_segment_range.network_type, ++ _network_segment_range.physical_network, ++ _network_segment_range.minimum, ++ _network_segment_range.maximum, ++ {'3312e4ba67864b2eb53f3f41432f8efc': ['104', '106']}, ++ ['100-103', '105'], ++ )) ++ ++ def setUp(self): ++ super(TestListNetworkSegmentRange, self).setUp() ++ ++ # Get the command object to test ++ self.cmd = network_segment_range.ListNetworkSegmentRange( ++ self.app, self.namespace) ++ ++ self.network.find_extension = mock.Mock() ++ self.network.network_segment_ranges = mock.Mock( ++ return_value=self._network_segment_ranges) ++ ++ def test_list_no_option(self): ++ arglist = [] ++ verifylist = [ ++ ('long', False), ++ ('available', False), ++ ('unavailable', False), ++ ('used', False), ++ ('unused', False), ++ ] ++ parsed_args = self.check_parser(self.cmd, arglist, verifylist) ++ ++ columns, data = self.cmd.take_action(parsed_args) ++ ++ self.network.network_segment_ranges.assert_called_once_with() ++ self.assertEqual(self.columns, columns) ++ self.assertEqual(self.data, list(data)) ++ ++ def test_list_long(self): ++ arglist = [ ++ '--long', ++ ] ++ verifylist = [ ++ ('long', True), ++ ('available', False), ++ ('unavailable', False), ++ ('used', False), ++ ('unused', False), ++ ] ++ parsed_args = self.check_parser(self.cmd, arglist, verifylist) ++ ++ columns, data = self.cmd.take_action(parsed_args) ++ ++ self.network.network_segment_ranges.assert_called_once_with() ++ self.assertEqual(self.columns_long, columns) ++ self.assertEqual(self.data_long, list(data)) ++ ++ ++class TestSetNetworkSegmentRange(TestNetworkSegmentRange): ++ ++ # The network segment to show. ++ _network_segment_range = network_fakes.FakeNetworkSegmentRange.\ ++ create_one_network_segment_range() ++ ++ def setUp(self): ++ super(TestSetNetworkSegmentRange, self).setUp() ++ ++ self.network.find_extension = mock.Mock() ++ self.network.find_network_segment_range = mock.Mock( ++ return_value=self._network_segment_range ++ ) ++ self.network.update_network_segment_range = mock.Mock( ++ return_value=self._network_segment_range ++ ) ++ ++ # Get the command object to test ++ self.cmd = network_segment_range.SetNetworkSegmentRange(self.app, ++ self.namespace) ++ ++ def test_set_no_options(self): ++ arglist = [ ++ self._network_segment_range.id, ++ ] ++ verifylist = [ ++ ('network_segment_range', self._network_segment_range.id), ++ ] ++ ++ parsed_args = self.check_parser(self.cmd, arglist, verifylist) ++ result = self.cmd.take_action(parsed_args) ++ ++ self.network.update_network_segment_range.assert_called_once_with( ++ self._network_segment_range, **{} ++ ) ++ self.assertIsNone(result) ++ ++ def test_set_all_options(self): ++ arglist = [ ++ '--name', 'new name', ++ '--minimum', str(32), ++ '--maximum', str(512), ++ self._network_segment_range.id, ++ ] ++ verifylist = [ ++ ('name', 'new name'), ++ ('minimum', 32), ++ ('maximum', 512), ++ ('network_segment_range', self._network_segment_range.id), ++ ] ++ ++ parsed_args = self.check_parser(self.cmd, arglist, verifylist) ++ result = self.cmd.take_action(parsed_args) ++ ++ attrs = { ++ 'name': 'new name', ++ 'minimum': 32, ++ 'maximum': 512, ++ } ++ self.network.update_network_segment_range.assert_called_once_with( ++ self._network_segment_range, **attrs ++ ) ++ self.assertIsNone(result) ++ ++ ++class TestShowNetworkSegmentRange(TestNetworkSegmentRange): ++ ++ # The network segment range to show. ++ _network_segment_range = network_fakes.FakeNetworkSegmentRange.\ ++ create_one_network_segment_range() ++ ++ columns = ( ++ 'available', ++ 'default', ++ 'id', ++ 'maximum', ++ 'minimum', ++ 'name', ++ 'network_type', ++ 'physical_network', ++ 'project_id', ++ 'shared', ++ 'used', ++ ) ++ ++ data = ( ++ ['100-103', '105'], ++ _network_segment_range.default, ++ _network_segment_range.id, ++ _network_segment_range.maximum, ++ _network_segment_range.minimum, ++ _network_segment_range.name, ++ _network_segment_range.network_type, ++ _network_segment_range.physical_network, ++ _network_segment_range.project_id, ++ _network_segment_range.shared, ++ {'3312e4ba67864b2eb53f3f41432f8efc': ['104', '106']}, ++ ) ++ ++ def setUp(self): ++ super(TestShowNetworkSegmentRange, self).setUp() ++ ++ self.network.find_extension = mock.Mock() ++ self.network.find_network_segment_range = mock.Mock( ++ return_value=self._network_segment_range ++ ) ++ ++ # Get the command object to test ++ self.cmd = network_segment_range.ShowNetworkSegmentRange( ++ self.app, self.namespace) ++ ++ def test_show_no_options(self): ++ # Missing required args should bail here ++ self.assertRaises(tests_utils.ParserException, self.check_parser, ++ self.cmd, [], []) ++ ++ def test_show_all_options(self): ++ arglist = [ ++ self._network_segment_range.id, ++ ] ++ verifylist = [ ++ ('network_segment_range', self._network_segment_range.id), ++ ] ++ ++ parsed_args = self.check_parser(self.cmd, arglist, verifylist) ++ columns, data = self.cmd.take_action(parsed_args) ++ ++ self.network.find_network_segment_range.assert_called_once_with( ++ self._network_segment_range.id, ++ ignore_missing=False ++ ) ++ ++ self.assertEqual(self.columns, columns) ++ self.assertEqual(self.data, data) +diff --git a/releasenotes/notes/bp-network-segment-range-management-0abf03fe03eea149.yaml b/releasenotes/notes/bp-network-segment-range-management-0abf03fe03eea149.yaml +new file mode 100644 +index 0000000..4ff4f57 +--- /dev/null ++++ b/releasenotes/notes/bp-network-segment-range-management-0abf03fe03eea149.yaml +@@ -0,0 +1,6 @@ ++--- ++features: ++ - Add ``network segment range create``, ``network segment range delete``, ++ ``network segment range list``, ``network segment range show`` and ++ ``network segment range set`` commands. ++ [Blueprint `network-segment-range-management `_] +diff --git a/setup.cfg b/setup.cfg +index 48c2247..c73f2ce 100644 +--- a/setup.cfg ++++ b/setup.cfg +@@ -463,6 +463,12 @@ + network_segment_set = openstackclient.network.v2.network_segment:SetNetworkSegment + network_segment_show = openstackclient.network.v2.network_segment:ShowNetworkSegment + ++ network_segment_range_create = openstackclient.network.v2.network_segment_range:CreateNetworkSegmentRange ++ network_segment_range_delete = openstackclient.network.v2.network_segment_range:DeleteNetworkSegmentRange ++ network_segment_range_list = openstackclient.network.v2.network_segment_range:ListNetworkSegmentRange ++ network_segment_range_set = openstackclient.network.v2.network_segment_range:SetNetworkSegmentRange ++ network_segment_range_show = openstackclient.network.v2.network_segment_range:ShowNetworkSegmentRange ++ + network_service_provider_list = openstackclient.network.v2.network_service_provider:ListNetworkServiceProvider + + port_create = openstackclient.network.v2.port:CreatePort diff --git a/openstack/python-openstackclient/centos/patches/0001-Allow-setting-wrs-binding-vif_model-using-osclient.patch b/openstack/python-openstackclient/centos/patches/0001-Allow-setting-wrs-binding-vif_model-using-osclient.patch deleted file mode 100644 index ae4bc2e5..00000000 --- a/openstack/python-openstackclient/centos/patches/0001-Allow-setting-wrs-binding-vif_model-using-osclient.patch +++ /dev/null @@ -1,64 +0,0 @@ -From 405e39f8a77c7f33dda80b2681ff53407b2aa256 Mon Sep 17 00:00:00 2001 -From: rpm-build -Date: Tue, 25 Sep 2018 14:53:18 -0400 -Subject: [PATCH] Allow setting wrs-binding:vif_model using osclient - ---- - openstackclient/network/v2/port.py | 21 +++++++++++++++++++++ - 1 file changed, 21 insertions(+) - -diff --git a/openstackclient/network/v2/port.py b/openstackclient/network/v2/port.py -index 4a29daf..22cba16 100644 ---- a/openstackclient/network/v2/port.py -+++ b/openstackclient/network/v2/port.py -@@ -389,6 +389,12 @@ class CreatePort(command.ShowOne): - "ip-address=[,mac-address=] " - "(repeat option to set multiple allowed-address pairs)") - ) -+ port_security.add_argument( -+ '--wrs-binding:vif_model', -+ dest='wrs_vif_model', -+ metavar='', -+ help=_("Set wrs-binding:vif_model for this port") -+ ) - _tag.add_tag_option_to_parser_for_create(parser, _('port')) - return parser - -@@ -421,6 +427,11 @@ class CreatePort(command.ShowOne): - if parsed_args.qos_policy: - attrs['qos_policy_id'] = client.find_qos_policy( - parsed_args.qos_policy, ignore_missing=False).id -+ -+ if parsed_args.wrs_vif_model: -+ attrs['wrs-binding:vif_model'] = parsed_args.wrs_vif_model -+ -+ - obj = client.create_port(**attrs) - # tags cannot be set when created, so tags need to be set later. - _tag.update_tags_for_set(client, obj, parsed_args) -@@ -705,6 +716,13 @@ class SetPort(command.Command): - "Unset it to None with the 'port unset' command " - "(requires data plane status extension)") - ) -+ port_security.add_argument( -+ '--wrs-binding:vif_model', -+ dest='wrs_vif_model', -+ metavar='', -+ help=_("Set wrs-binding:vif_model for this port") -+ ) -+ - _tag.add_tag_option_to_parser_for_set(parser, _('port')) - - return parser -@@ -762,6 +780,9 @@ class SetPort(command.Command): - if parsed_args.data_plane_status: - attrs['data_plane_status'] = parsed_args.data_plane_status - -+ if parsed_args.wrs_vif_model: -+ attrs['wrs-binding:vif_model'] = parsed_args.wrs_vif_model -+ - if attrs: - client.update_port(obj, **attrs) - --- -1.8.3.1 diff --git a/openstack/python-openstackclient/centos/patches/0001-CGTS-7947-add-os-keystone-region-name-to-identity-cl.patch b/openstack/python-openstackclient/centos/patches/0001-CGTS-7947-add-os-keystone-region-name-to-identity-cl.patch deleted file mode 100644 index d8a92ed1..00000000 --- a/openstack/python-openstackclient/centos/patches/0001-CGTS-7947-add-os-keystone-region-name-to-identity-cl.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 54d7b55413d3374911957f6327ebd73f70ee24b8 Mon Sep 17 00:00:00 2001 -From: rpm-build -Date: Thu, 2 Nov 2017 10:40:15 -0400 -Subject: [PATCH 1/1] CGTS-7947: add --os-keystone-region-name to identity - client - -Signed-off-by: rpm-build ---- - openstackclient/identity/client.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/openstackclient/identity/client.py b/openstackclient/identity/client.py -index 0292aac..e2f4756 100644 ---- a/openstackclient/identity/client.py -+++ b/openstackclient/identity/client.py -@@ -53,7 +53,7 @@ def make_client(instance): - - client = identity_client( - session=instance.session, -- region_name=instance.region_name, -+ region_name=instance.keystone_region_name, - **kwargs - ) - --- -1.8.3.1 - diff --git a/openstack/python-openstackclient/centos/patches/0001-Optimize-getting-endpoint-list.patch b/openstack/python-openstackclient/centos/patches/0001-Optimize-getting-endpoint-list.patch deleted file mode 100644 index 2d004cb3..00000000 --- a/openstack/python-openstackclient/centos/patches/0001-Optimize-getting-endpoint-list.patch +++ /dev/null @@ -1,99 +0,0 @@ -From f6f5ce03c5b8a03180db24a02dda5b30f40b4cee Mon Sep 17 00:00:00 2001 -From: Anton Frolov -Date: Mon, 25 Sep 2017 12:31:24 -0700 -Subject: [PATCH] Optimize getting endpoint list - -Currently ListEndpoint.take_action method unconditionally iterates -over all endpoints and issue GET /v3/services/ -request for each endpoint. In case of HTTPS keystone endpoint this -can take significant amout of time, and it only getting worse in -case of multiple regions. - -This commit change this logic to making just two GET requests: first -it gets endpoint list, then it gets service list, searching service -in the list instead of issuing GET /v3/services/ request. - -Change-Id: I22b61c0b45b0205a2f5a4608c2473cb7814fe3cf -Closes-Bug: 1719413 ---- - openstackclient/identity/common.py | 10 ++++++++++ - openstackclient/identity/v3/endpoint.py | 3 ++- - openstackclient/tests/unit/identity/v3/test_endpoint.py | 2 ++ - releasenotes/notes/bug-1719413-0401d05c91cc9094.yaml | 8 ++++++++ - 4 files changed, 22 insertions(+), 1 deletion(-) - create mode 100644 releasenotes/notes/bug-1719413-0401d05c91cc9094.yaml - -diff --git a/openstackclient/identity/common.py b/openstackclient/identity/common.py -index 3dc5adb..e119f66 100644 ---- a/openstackclient/identity/common.py -+++ b/openstackclient/identity/common.py -@@ -26,6 +26,16 @@ from osc_lib import utils - from openstackclient.i18n import _ - - -+def find_service_in_list(service_list, service_id): -+ """Find a service by id in service list.""" -+ -+ for service in service_list: -+ if service.id == service_id: -+ return service -+ raise exceptions.CommandError( -+ "No service with a type, name or ID of '%s' exists." % service_id) -+ -+ - def find_service(identity_client, name_type_or_id): - """Find a service by id, name or type.""" - -diff --git a/openstackclient/identity/v3/endpoint.py b/openstackclient/identity/v3/endpoint.py -index 15760a1..3b4dd0d 100644 ---- a/openstackclient/identity/v3/endpoint.py -+++ b/openstackclient/identity/v3/endpoint.py -@@ -167,9 +167,10 @@ class ListEndpoint(command.Lister): - if parsed_args.region: - kwargs['region'] = parsed_args.region - data = identity_client.endpoints.list(**kwargs) -+ service_list = identity_client.services.list() - - for ep in data: -- service = common.find_service(identity_client, ep.service_id) -+ service = common.find_service_in_list(service_list, ep.service_id) - ep.service_name = get_service_name(service) - ep.service_type = service.type - return (columns, -diff --git a/openstackclient/tests/unit/identity/v3/test_endpoint.py b/openstackclient/tests/unit/identity/v3/test_endpoint.py -index 765fbed..fad53fc 100644 ---- a/openstackclient/tests/unit/identity/v3/test_endpoint.py -+++ b/openstackclient/tests/unit/identity/v3/test_endpoint.py -@@ -295,6 +295,7 @@ class TestEndpointList(TestEndpoint): - - # This is the return value for common.find_resource(service) - self.services_mock.get.return_value = self.service -+ self.services_mock.list.return_value = [self.service] - - # Get the command object to test - self.cmd = endpoint.ListEndpoint(self.app, None) -@@ -726,6 +727,7 @@ class TestEndpointListServiceWithoutName(TestEndpointList): - - # This is the return value for common.find_resource(service) - self.services_mock.get.return_value = self.service -+ self.services_mock.list.return_value = [self.service] - - # Get the command object to test - self.cmd = endpoint.ListEndpoint(self.app, None) -diff --git a/releasenotes/notes/bug-1719413-0401d05c91cc9094.yaml b/releasenotes/notes/bug-1719413-0401d05c91cc9094.yaml -new file mode 100644 -index 0000000..784d19e ---- /dev/null -+++ b/releasenotes/notes/bug-1719413-0401d05c91cc9094.yaml -@@ -0,0 +1,8 @@ -+--- -+fixes: -+ - | -+ Fix an issue with ``endpoint list`` working slow because it is issuing one GET -+ request to /v3/services/ Keystone API for each endpoint. In case of HTTPS -+ keystone endpoint and multiple regions it can take significant amount of time. -+ [Bug `1719413 `_] -+ --- -1.8.3.1 - diff --git a/openstack/python-openstackclient/centos/patches/0001-Remove-wrs-binding-mac_filtering-and-setting-extensi.patch b/openstack/python-openstackclient/centos/patches/0001-Remove-wrs-binding-mac_filtering-and-setting-extensi.patch deleted file mode 100644 index 32abb61d..00000000 --- a/openstack/python-openstackclient/centos/patches/0001-Remove-wrs-binding-mac_filtering-and-setting-extensi.patch +++ /dev/null @@ -1,231 +0,0 @@ -From 2554505ca186f59b4dd51081565c1d6a8be50db7 Mon Sep 17 00:00:00 2001 -From: rpm-build -Date: Tue, 30 Oct 2018 11:07:43 -0400 -Subject: [PATCH] Remove wrs-binding:mac_filtering and setting extension - ---- - openstackclient/network/v2/port.py | 1 - - openstackclient/network/v2/setting.py | 183 ---------------------------------- - setup.cfg | 4 - - 3 files changed, 188 deletions(-) - delete mode 100644 openstackclient/network/v2/setting.py - -diff --git a/openstackclient/network/v2/port.py b/openstackclient/network/v2/port.py -index 22cba16..d158791 100644 ---- a/openstackclient/network/v2/port.py -+++ b/openstackclient/network/v2/port.py -@@ -64,7 +64,6 @@ def _get_columns(item): - 'tenant_id': 'project_id', - 'mtu': 'wrs-binding:mtu', - 'vif_model': 'wrs-binding:vif_model', -- 'mac_filtering': 'wrs-binding:mac_filtering', - } - return sdk_utils.get_osc_show_columns_for_sdk_resource(item, column_map) - -diff --git a/openstackclient/network/v2/setting.py b/openstackclient/network/v2/setting.py -deleted file mode 100644 -index 6be88dd..0000000 ---- a/openstackclient/network/v2/setting.py -+++ /dev/null -@@ -1,183 +0,0 @@ --# 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. --# --# Copyright (c) 2016 Wind River Systems, Inc. --# --# --# --# --# -- --"""Settings action implementations""" -- --from osc_lib.command import command --from osc_lib import exceptions --from osc_lib import utils --from openstackclient.i18n import _ --from openstackclient.identity import common as identity_common --from openstackclient.network import common --from openstackclient.network import sdk_utils -- --_formatters = {} -- -- --def _get_columns(item): -- column_map = {"id": "project_id"} -- invisible_columns = ["name"] -- return sdk_utils.get_osc_show_columns_for_sdk_resource(item, column_map, -- invisible_columns) -- -- --def _get_attrs(client_manager, parsed_args): -- attrs = {key: parsed_args[key] for key in ["mac_filtering"] -- if key in parsed_args} -- -- if 'project' in parsed_args and parsed_args["project"] is not None: -- identity_client = client_manager.identity -- project_id = identity_common.find_project( -- identity_client, -- parsed_args["project"] -- ).id -- attrs['project_id'] = project_id -- -- return attrs -- -- --class ListSetting(common.NetworkAndComputeLister): -- """List settings of all projects who have non-default setting values""" -- -- def update_parser_common(self, parser): -- return parser -- -- def take_action_network(self, client, parsed_args): -- columns = ( -- 'mac_filtering', -- 'project_id' -- ) -- column_headers = ( -- 'Mac Filtering', -- 'Project ID' -- ) -- -- args = {} -- -- data = client.settings(**args) -- -- return (column_headers, -- (utils.get_item_properties( -- s, columns, -- formatters=_formatters, -- ) for s in data)) -- -- def take_action_compute(self, client, parsed_args): -- raise exceptions.CommandError("This command needs access to" -- " a network endpoint.") -- return -- -- --class ShowSetting(common.NetworkAndComputeShowOne): -- """Show settings of a given project""" -- -- def update_parser_common(self, parser): -- parser.add_argument( -- '--project', -- metavar='', -- help=_("Owner's project (name or ID)"), -- required=False -- ) -- return parser -- -- def take_action_network(self, client, parsed_args): -- client = self.app.client_manager.network -- # if no project id is specified, operate on current project -- args = _get_attrs(self.app.client_manager, vars(parsed_args)) -- if not "project_id" in args: -- args["project_id"] = client.find_tenant().project_id -- project_id = args["project_id"] -- -- obj = client.find_setting(project_id, ignore_missing=False) -- -- display_columns, columns = _get_columns(obj) -- data = utils.get_item_properties(obj, columns, formatters=_formatters) -- return (display_columns, data) -- -- def take_action_compute(self, client, parsed_args): -- raise exceptions.CommandError("This command needs access to" -- " a network endpoint.") -- return -- -- --# this one uses NetworkAndComputeCommand because settings can be deleted --# without a project id --class DeleteSetting(common.NetworkAndComputeCommand): -- """Delete setting""" -- -- def update_parser_common(self, parser): -- parser.add_argument( -- '--project', -- metavar='', -- help=_("Owner's project (name or ID)"), -- required=False -- ) -- return parser -- -- def take_action_network(self, client, parsed_args): -- client = self.app.client_manager.network -- # if no project id is specified, operate on current project -- args = _get_attrs(self.app.client_manager, vars(parsed_args)) -- if not "project_id" in args: -- args["project_id"] = client.find_tenant().project_id -- project_id = args["project_id"] -- -- client.delete_setting(project_id) -- return -- -- def take_action_compute(self, client, parsed_args): -- raise exceptions.CommandError("This command needs " -- "access to a network endpoint.") -- return -- -- --class UpdateSetting(command.Command): -- """Set setting properties""" -- -- def get_parser(self, prog_name): -- parser = super(UpdateSetting, self).get_parser(prog_name) -- parser.add_argument( -- '--project', -- metavar='', -- help=_("Owner's project (name or ID)"), -- required=False -- ) -- parser.add_argument('--mac-filtering', metavar='mac_filtering', -- help="Enable/Disable source MAC filtering" -- " on all ports", -- required=True) -- return parser -- -- def take_action(self, parsed_args): -- client = self.app.client_manager.network -- # if no project id is specified, operate on current project -- args = _get_attrs(self.app.client_manager, vars(parsed_args)) -- if not "project_id" in args: -- args["project_id"] = client.find_tenant().project_id -- project_id = args["project_id"] -- del args['project_id'] -- -- client.find_setting(project_id, ignore_missing=False) -- -- if args == {}: -- msg = "Nothing specified to be set" -- raise exceptions.CommandError(msg) -- -- client.update_setting(project_id, **args) -- return -diff --git a/setup.cfg b/setup.cfg -index d87b387..3e107bb 100644 ---- a/setup.cfg -+++ b/setup.cfg -@@ -435,10 +435,6 @@ openstack.network.v2 = - portforwarding_create = openstackclient.network.v2.portforwarding:CreatePortforwarding - portforwarding_update = openstackclient.network.v2.portforwarding:UpdatePortforwarding - portforwarding_delete = openstackclient.network.v2.portforwarding:DeletePortforwarding -- setting_list = openstackclient.network.v2.setting:ListSetting -- setting_show = openstackclient.network.v2.setting:ShowSetting -- setting_update = openstackclient.network.v2.setting:UpdateSetting -- setting_delete = openstackclient.network.v2.setting:DeleteSetting - net_host_list = openstackclient.network.v2.host:ListHost - net_host_show = openstackclient.network.v2.host:ShowHost - net_host_create = openstackclient.network.v2.host:CreateHost --- -1.8.3.1 - diff --git a/openstack/python-openstackclient/centos/patches/0001-US101470-Openstackclient-implementation-of-novaclien.patch b/openstack/python-openstackclient/centos/patches/0001-US101470-Openstackclient-implementation-of-novaclien.patch deleted file mode 100644 index c0fd0a88..00000000 --- a/openstack/python-openstackclient/centos/patches/0001-US101470-Openstackclient-implementation-of-novaclien.patch +++ /dev/null @@ -1,232 +0,0 @@ -From 47122b746e16ffb3d35d14aa4f51f0f759400b71 Mon Sep 17 00:00:00 2001 -From: Sen Yang -Date: Mon, 18 Dec 2017 10:08:08 -0500 -Subject: [PATCH 1/1] US101470 Openstackclient implementation of novaclient cli - with wrs extension - - In this commit the following OSC equivalence of novaclient cli with - wrs extension is implemented: - openstack pcidevice list - nova device-list - openstack pcidevice show - nova device-show - openstack providernet pci show - nova providernet-show ---- - openstackclient/compute/v2/wrs_pci.py | 88 ++++++++++++++++++++++++ - openstackclient/compute/v2/wrs_providernets.py | 46 +++++++++++++ - python_openstackclient.egg-info/SOURCES.txt | 4 +- - python_openstackclient.egg-info/entry_points.txt | 3 + - setup.cfg | 3 + - 5 files changed, 143 insertions(+), 1 deletion(-) - create mode 100644 openstackclient/compute/v2/wrs_pci.py - create mode 100644 openstackclient/compute/v2/wrs_providernets.py - -diff --git a/openstackclient/compute/v2/wrs_pci.py b/openstackclient/compute/v2/wrs_pci.py -new file mode 100644 -index 0000000..c3fba81 ---- /dev/null -+++ b/openstackclient/compute/v2/wrs_pci.py -@@ -0,0 +1,88 @@ -+# 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. -+# -+# Copyright (c) 2015-2017 Wind River Systems, Inc. -+# -+# -+# -+# -+ -+ -+"""Compute v2 wrs_pci action implementations""" -+ -+from osc_lib.cli import parseractions -+from osc_lib.command import command -+from osc_lib import utils -+import six -+ -+from openstackclient.i18n import _ -+ -+ -+class ListPciDevices(command.Lister): -+ """List pci device""" -+ -+ def get_parser(self, prog_name): -+ parser = super(ListPciDevices, self).get_parser(prog_name) -+ parser.add_argument( -+ "--device", -+ metavar="", -+ help=_("PCI devices matching a particular device id or alias.") -+ ) -+ return parser -+ -+ def take_action(self, parsed_args): -+ compute_client = self.app.client_manager.compute -+ -+ columns = ( -+ "PCI Alias", -+ "Device Id", -+ "Vendor Id", -+ "Class Id", -+ "pci_pfs_configured", -+ "pci_pfs_used", -+ "pci_vfs_configured", -+ "pci_vfs_used" -+ ) -+ -+ data = compute_client.wrs_pci.list(parsed_args.device) -+ -+ return (columns, -+ (utils.get_item_properties( -+ s, columns, -+ ) for s in data)) -+ -+ -+class ShowPciDevices(command.ShowOne): -+ """Show details of a given PCI device.""" -+ -+ def get_parser(self, prog_name): -+ parser = super(ShowPciDevices, self).get_parser(prog_name) -+ parser.add_argument( -+ "device", -+ metavar="", -+ help=_("Device alias or device id of the PCI device.") -+ ) -+ parser.add_argument( -+ "--host", -+ metavar="", -+ help=_("Limit matches to PCI devices from a particular host") -+ ) -+ return parser -+ -+ def take_action(self, parsed_args): -+ compute_client = self.app.client_manager.compute -+ deviceInfo = compute_client.wrs_pci.get(parsed_args.device, -+ parsed_args.host) -+ -+ data = deviceInfo._info.copy() -+ return zip(*sorted(six.iteritems(data))) -+ -diff --git a/openstackclient/compute/v2/wrs_providernets.py b/openstackclient/compute/v2/wrs_providernets.py -new file mode 100644 -index 0000000..b487fb6 ---- /dev/null -+++ b/openstackclient/compute/v2/wrs_providernets.py -@@ -0,0 +1,46 @@ -+# 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. -+# -+# Copyright (c) 2015-2017 Wind River Systems, Inc. -+# -+# -+# -+# -+ -+ -+"""Compute v2 wrs_providernet action implementations""" -+ -+from osc_lib.cli import parseractions -+from osc_lib.command import command -+import six -+ -+from openstackclient.i18n import _ -+ -+ -+class ShowProvidernetPci(command.ShowOne): -+ """Show details of a given provider network""" -+ -+ def get_parser(self, prog_name): -+ parser = super(ShowProvidernetPci, self).get_parser(prog_name) -+ parser.add_argument( -+ "providernet", -+ metavar="", -+ help=_("Id of the provider network") -+ ) -+ return parser -+ -+ def take_action(self, parsed_args): -+ compute_client = self.app.client_manager.compute -+ -+ providernet = compute_client.wrs_providernets.get(parsed_args.providernet) -+ stats = providernet._info.copy() -+ return zip(*sorted(six.iteritems(stats))) -diff --git a/python_openstackclient.egg-info/SOURCES.txt b/python_openstackclient.egg-info/SOURCES.txt -index 82dae1c..66b9513 100644 ---- a/python_openstackclient.egg-info/SOURCES.txt -+++ b/python_openstackclient.egg-info/SOURCES.txt -@@ -188,6 +188,8 @@ openstackclient/compute/v2/server_group.py - openstackclient/compute/v2/server_image.py - openstackclient/compute/v2/service.py - openstackclient/compute/v2/usage.py -+openstackclient/compute/v2/wrs_pci.py -+openstackclient/compute/v2/wrs_providernets.py - openstackclient/identity/__init__.py - openstackclient/identity/client.py - openstackclient/identity/common.py -@@ -900,4 +902,4 @@ releasenotes/source/unreleased.rst - releasenotes/source/_static/.placeholder - releasenotes/source/_templates/.placeholder - tools/fast8.sh --tools/tox_install.sh -\ No newline at end of file -+tools/tox_install.sh -diff --git a/python_openstackclient.egg-info/entry_points.txt b/python_openstackclient.egg-info/entry_points.txt -index 99aaf5e..9a717b8 100644 ---- a/python_openstackclient.egg-info/entry_points.txt -+++ b/python_openstackclient.egg-info/entry_points.txt -@@ -45,6 +45,8 @@ compute_service_list = openstackclient.compute.v2.service:ListService - compute_service_set = openstackclient.compute.v2.service:SetService - console_log_show = openstackclient.compute.v2.console:ShowConsoleLog - console_url_show = openstackclient.compute.v2.console:ShowConsoleURL -+pcidevice_list = openstackclient.compute.v2.wrs_pci:ListPciDevices -+pcidevice_show = openstackclient.compute.v2.wrs_pci:ShowPciDevices - flavor_create = openstackclient.compute.v2.flavor:CreateFlavor - flavor_delete = openstackclient.compute.v2.flavor:DeleteFlavor - flavor_list = openstackclient.compute.v2.flavor:ListFlavor -@@ -65,6 +67,7 @@ keypair_create = openstackclient.compute.v2.keypair:CreateKeypair - keypair_delete = openstackclient.compute.v2.keypair:DeleteKeypair - keypair_list = openstackclient.compute.v2.keypair:ListKeypair - keypair_show = openstackclient.compute.v2.keypair:ShowKeypair -+providernet_pci_show = openstackclient.compute.v2.wrs_providernets:ShowProvidernetPci - server_add_fixed_ip = openstackclient.compute.v2.server:AddFixedIP - server_add_floating_ip = openstackclient.compute.v2.server:AddFloatingIP - server_add_port = openstackclient.compute.v2.server:AddPort -diff --git a/setup.cfg b/setup.cfg -index 1bff735..f162417 100644 ---- a/setup.cfg -+++ b/setup.cfg -@@ -71,6 +71,8 @@ openstack.compute.v2 = - flavor_show = openstackclient.compute.v2.flavor:ShowFlavor - flavor_set = openstackclient.compute.v2.flavor:SetFlavor - flavor_unset = openstackclient.compute.v2.flavor:UnsetFlavor -+ pcidevice_list = openstackclient.compute.v2.wrs_pci:ListPciDevices -+ pcidevice_show = openstackclient.compute.v2.wrs_pci:ShowPciDevices - host_list = openstackclient.compute.v2.host:ListHost - host_set = openstackclient.compute.v2.host:SetHost - host_show = openstackclient.compute.v2.host:ShowHost -@@ -85,6 +87,7 @@ openstack.compute.v2 = - keypair_delete = openstackclient.compute.v2.keypair:DeleteKeypair - keypair_list = openstackclient.compute.v2.keypair:ListKeypair - keypair_show = openstackclient.compute.v2.keypair:ShowKeypair -+ providernet_pci_show = openstackclient.compute.v2.wrs_providernets:ShowProvidernetPci - server_add_fixed_ip = openstackclient.compute.v2.server:AddFixedIP - server_add_floating_ip = openstackclient.compute.v2.server:AddFloatingIP - server_add_port = openstackclient.compute.v2.server:AddPort --- -1.8.3.1 - diff --git a/openstack/python-openstackclient/centos/patches/0001-US106901-Openstack-CLI-Adoption.patch b/openstack/python-openstackclient/centos/patches/0001-US106901-Openstack-CLI-Adoption.patch deleted file mode 100644 index 72e144fc..00000000 --- a/openstack/python-openstackclient/centos/patches/0001-US106901-Openstack-CLI-Adoption.patch +++ /dev/null @@ -1,80 +0,0 @@ -From 9ab2fc77ed85aee4c6b63b0113e309136de419f0 Mon Sep 17 00:00:00 2001 -From: rpm-build -Date: Thu, 1 Feb 2018 10:20:53 -0500 -Subject: [PATCH 1/1] US106901 Openstack CLI Adoption: - Neutron/Cinder/Glance/Ceilometer - - CI partI - OSC cli support of "--cache-raw" and "--wait" i - options for "nova image-create" ---- - openstackclient/image/v2/image.py | 33 +++++++++++++++++++++++++++++++++ - 1 file changed, 33 insertions(+) - -diff --git a/openstackclient/image/v2/image.py b/openstackclient/image/v2/image.py -index c2c5c59..f5d4acf 100644 ---- a/openstackclient/image/v2/image.py -+++ b/openstackclient/image/v2/image.py -@@ -12,6 +12,12 @@ - # License for the specific language governing permissions and limitations - # under the License. - # -+# Copyright (c) 2013-2018 Wind River Systems, Inc. -+# SPDX-License-Identifier: Apache-2.0 -+# -+# -+# -+# - - """Image V2 Action Implementations""" - -@@ -253,6 +259,25 @@ class CreateImage(command.ShowOne): - dest=deadopt.replace('-', '_'), - help=argparse.SUPPRESS, - ) -+ #WRS extension -+ parser.add_argument( -+ "--cache-raw", -+ default=False, -+ action="store_true", -+ help=_("Convert the image to RAW in the background" -+ " and store it for fast access."), -+ ) -+ #WRS extension -+ parser.add_argument( -+ "--wait", -+ metavar="", -+ nargs='?', -+ type=int, -+ default=None, -+ const=0, -+ help=_("Wait for the convertion of the image to RAW" -+ " to finish before returning the image."), -+ ) - return parser - - def take_action(self, parsed_args): -@@ -302,6 +327,9 @@ class CreateImage(command.ShowOne): - kwargs['visibility'] = 'community' - if parsed_args.shared: - kwargs['visibility'] = 'shared' -+ #WRS extension -+ if parsed_args.cache_raw: -+ kwargs['cache_raw'] = 'True' - # Handle deprecated --owner option - project_arg = parsed_args.project - if parsed_args.owner: -@@ -361,6 +389,11 @@ class CreateImage(command.ShowOne): - with fp: - try: - image_client.images.upload(image.id, fp) -+ #WRS extension -+ # If cache_raw and wait options were chosen, wait until -+ # image is cached. -+ if parsed_args.cache_raw is True and parsed_args.wait is not None: -+ gc_utils.wait_for_caching(parsed_args.wait, image_client, image.id) - except Exception: - # If the upload fails for some reason attempt to remove the - # dangling queued image made by the create() call above but --- -1.8.3.1 - diff --git a/openstack/python-openstackclient/centos/patches/0001-neutron-extensions.patch b/openstack/python-openstackclient/centos/patches/0001-neutron-extensions.patch deleted file mode 100644 index 3bcdae47..00000000 --- a/openstack/python-openstackclient/centos/patches/0001-neutron-extensions.patch +++ /dev/null @@ -1,1822 +0,0 @@ -commit bf6c3b52f676888203082e25e404ed5e9503648e -Author: rpm-build -Date: Mon Feb 12 12:11:43 2018 -0500 - - neutron extensions - -diff --git a/openstackclient/network/v2/host.py b/openstackclient/network/v2/host.py -new file mode 100644 -index 0000000..f9dab8b ---- /dev/null -+++ b/openstackclient/network/v2/host.py -@@ -0,0 +1,191 @@ -+# 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. -+# -+# Copyright (c) 2016 Wind River Systems, Inc. -+# -+# -+# -+# -+# -+ -+"""Host action implementations""" -+ -+from osc_lib.command import command -+from osc_lib import exceptions -+from osc_lib import utils -+from openstackclient.network import common -+from openstackclient.network import sdk_utils -+ -+_showhost_formatters = { -+ 'agents': utils.format_list_of_dicts -+} -+ -+_listhost_formatters = { -+ 'agents': len -+} -+ -+ -+def _get_columns(item): -+ column_map = {} -+ return sdk_utils.get_osc_show_columns_for_sdk_resource(item, column_map) -+ -+ -+def _get_attrs(client_manager, parsed_args): -+ attrs = {key: parsed_args[key] for key in ['availability', 'id', 'name'] -+ if key in parsed_args and parsed_args[key] is not None} -+ return attrs -+ -+ -+class ListHost(common.NetworkAndComputeLister): -+ """List host""" -+ -+ def update_parser_common(self, parser): -+ return parser -+ -+ def take_action_network(self, client, parsed_args): -+ columns = ( -+ 'id', -+ 'name', -+ 'availability', -+ 'agents', -+ 'subnets', -+ 'routers', -+ 'ports' -+ ) -+ column_headers = ( -+ 'Id', -+ 'Name', -+ 'Availability', -+ 'Agents', -+ 'Subnets', -+ 'Routers', -+ 'Ports' -+ ) -+ -+ args = {} -+ -+ data = client.hosts(**args) -+ -+ return (column_headers, -+ (utils.get_item_properties( -+ s, columns, -+ formatters=_listhost_formatters, -+ ) for s in data)) -+ -+ def take_action_compute(self, client, parsed_args): -+ raise exceptions.CommandError("This command needs access to" -+ " a network endpoint.") -+ return -+ -+ -+class ShowHost(common.NetworkAndComputeShowOne): -+ """Show host details""" -+ -+ def update_parser_common(self, parser): -+ parser.add_argument( -+ 'host', -+ metavar="", -+ help=("ID or name of host to look up") -+ ) -+ return parser -+ -+ def take_action_network(self, client, parsed_args): -+ obj = client.find_host(parsed_args.host, ignore_missing=False) -+ display_columns, columns = _get_columns(obj) -+ data = utils.get_item_properties(obj, columns, -+ formatters=_showhost_formatters) -+ return (display_columns, data) -+ -+ def take_action_compute(self, client, parsed_args): -+ raise exceptions.CommandError("This command needs access to" -+ " a network endpoint.") -+ return -+ -+ -+class CreateHost(common.NetworkAndComputeShowOne): -+ """Create a host record""" -+ -+ def update_parser_common(self, parser): -+ parser.add_argument('--availability', metavar="availability", -+ help='Set host availability status to up or down', -+ required=False) -+ parser.add_argument('--id', metavar="id", -+ help='Create a new host record', -+ required=False) -+ parser.add_argument('name', metavar='NAME', -+ help='System hostname of given host') -+ return parser -+ -+ def take_action_network(self, client, parsed_args): -+ attrs = _get_attrs(self.app.client_manager, vars(parsed_args)) -+ -+ # the neutron equivalent command defaults to availability=down -+ # when not specified -+ if "availability" not in attrs: -+ attrs['availability'] = "down" -+ -+ obj = client.create_host(**attrs) -+ display_columns, columns = _get_columns(obj) -+ data = utils.get_item_properties(obj, columns, -+ formatters=_listhost_formatters) -+ return (display_columns, data) -+ -+ def take_action_compute(self, client, parsed_args): -+ raise exceptions.CommandError("This command needs access to" -+ " a network endpoint.") -+ return -+ -+ -+class DeleteHost(common.NetworkAndComputeDelete): -+ """Delete host""" -+ -+ # Used by base class to find resources in parsed_args. -+ resource = 'name' -+ r = None -+ -+ def update_parser_common(self, parser): -+ parser.add_argument('name', metavar='NAME', nargs="+", -+ help='System hostname of given host') -+ return parser -+ -+ def take_action_network(self, client, parsed_args): -+ obj = client.find_host(self.r) -+ client.delete_host(obj) -+ -+ def take_action_compute(self, client, parsed_args): -+ raise exceptions.CommandError("This command needs access to" -+ " a network endpoint.") -+ return -+ -+ -+class UpdateHost(command.Command): -+ """Set host properties""" -+ -+ def get_parser(self, prog_name): -+ parser = super(UpdateHost, self).get_parser(prog_name) -+ parser.add_argument('--availability', metavar="availability", -+ help='Set host availability status to up or down', -+ required=False) -+ parser.add_argument('host', metavar='HOST', -+ help='System hostname of given host') -+ return parser -+ -+ def take_action(self, parsed_args): -+ client = self.app.client_manager.network -+ obj = client.find_host(parsed_args.host, ignore_missing=False) -+ attrs = _get_attrs(self.app.client_manager, vars(parsed_args)) -+ -+ if attrs == {}: -+ msg = "Nothing specified to be set" -+ raise exceptions.CommandError(msg) -+ client.update_host(obj, **attrs) -+ return -diff --git a/openstackclient/network/v2/port.py b/openstackclient/network/v2/port.py -index 9536fe8..4a29daf 100644 ---- a/openstackclient/network/v2/port.py -+++ b/openstackclient/network/v2/port.py -@@ -62,6 +62,9 @@ def _get_columns(item): - 'is_admin_state_up': 'admin_state_up', - 'is_port_security_enabled': 'port_security_enabled', - 'tenant_id': 'project_id', -+ 'mtu': 'wrs-binding:mtu', -+ 'vif_model': 'wrs-binding:vif_model', -+ 'mac_filtering': 'wrs-binding:mac_filtering', - } - return sdk_utils.get_osc_show_columns_for_sdk_resource(item, column_map) - -diff --git a/openstackclient/network/v2/portforwarding.py b/openstackclient/network/v2/portforwarding.py -new file mode 100644 -index 0000000..0f70e84 ---- /dev/null -+++ b/openstackclient/network/v2/portforwarding.py -@@ -0,0 +1,259 @@ -+# 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. -+# -+# Copyright (c) 2016 Wind River Systems, Inc. -+# -+# -+# -+# -+# -+ -+"""Port forwarding action implementations""" -+ -+import argparse -+from osc_lib.command import command -+from osc_lib import exceptions -+from osc_lib import utils -+from openstackclient.i18n import _ -+from openstackclient.identity import common as identity_common -+from openstackclient.network import common -+from openstackclient.network import sdk_utils -+ -+_formatters = {} -+ -+ -+def _get_columns(item): -+ column_map = {} -+ invisible_columns = ["name"] -+ return sdk_utils.get_osc_show_columns_for_sdk_resource(item, column_map, -+ invisible_columns) -+ -+ -+def _get_attrs(client_manager, parsed_args): -+ attr_names = ['inside_addr', 'inside_port', 'outside_port', -+ 'protocol', 'description', 'router_id'] -+ attrs = {key: parsed_args[key] for key in attr_names -+ if key in parsed_args and parsed_args[key] is not None} -+ -+ if 'project' in parsed_args and parsed_args["project"] is not None: -+ identity_client = client_manager.identity -+ project_id = identity_common.find_project( -+ identity_client, -+ parsed_args["project"] -+ ).id -+ # TODO(dtroyer): Remove tenant_id when we clean up the SDK refactor -+ attrs['tenant_id'] = project_id -+ attrs['project_id'] = project_id -+ -+ return attrs -+ -+ -+class ListPortforwarding(common.NetworkAndComputeLister): -+ """List portforwarding""" -+ -+ def update_parser_common(self, parser): -+ parser.add_argument( -+ '--project', -+ metavar='', -+ help=_("Owner's project (name or ID)") -+ ) -+ parser.add_argument( -+ '--router-id', -+ metavar='', -+ help=_("Router's ID") -+ ) -+ return parser -+ -+ def take_action_network(self, client, parsed_args): -+ columns = ( -+ 'id', -+ 'router_id', -+ 'inside_addr', -+ 'inside_port', -+ 'outside_port', -+ 'protocol', -+ ) -+ column_headers = ( -+ 'ID', -+ 'Router ID', -+ 'Inside Address', -+ 'Inside Port', -+ 'Outside Port', -+ 'Protocol' -+ ) -+ -+ args = _get_attrs(self.app.client_manager, vars(parsed_args)) -+ -+ data = client.portforwardings(**args) -+ -+ return (column_headers, -+ (utils.get_item_properties( -+ s, columns, -+ formatters=_formatters, -+ ) for s in data)) -+ -+ def take_action_compute(self, client, parsed_args): -+ raise exceptions.CommandError("This command needs access to" -+ " a network endpoint.") -+ return -+ -+ -+class ShowPortforwarding(common.NetworkAndComputeShowOne): -+ """Show portforwarding details""" -+ -+ def update_parser_common(self, parser): -+ parser.add_argument( -+ 'portforwarding', -+ metavar="", -+ help=("Portforwarding to display (ID)") -+ ) -+ return parser -+ -+ def take_action_network(self, client, parsed_args): -+ obj = client.find_portforwarding(parsed_args.portforwarding, -+ ignore_missing=False) -+ display_columns, columns = _get_columns(obj) -+ data = utils.get_item_properties(obj, columns, formatters=_formatters) -+ return (display_columns, data) -+ -+ def take_action_compute(self, client, parsed_args): -+ raise exceptions.CommandError("This command needs access to" -+ " a network endpoint.") -+ return -+ -+ -+class CreatePortforwarding(common.NetworkAndComputeShowOne): -+ """Create new portforwarding""" -+ -+ def update_parser_common(self, parser): -+ parser.add_argument( -+ '--inside-addr', -+ help='Private IP address.') -+ parser.add_argument( -+ '--inside_addr', -+ help=argparse.SUPPRESS) -+ parser.add_argument( -+ '--inside-port', -+ help='Private layer4 protocol port.') -+ parser.add_argument( -+ '--inside_port', -+ help=argparse.SUPPRESS) -+ parser.add_argument( -+ '--outside-port', -+ help='Public layer4 protocol port.') -+ parser.add_argument( -+ '--outside_port', -+ help=argparse.SUPPRESS) -+ parser.add_argument( -+ '--protocol', -+ help='Layer4 protocol port number.') -+ parser.add_argument( -+ '--project', -+ metavar='', -+ help=_("Owner's project (name or ID)") -+ ) -+ identity_common.add_project_domain_option_to_parser(parser) -+ parser.add_argument( -+ '--description', -+ help='User specified text description') -+ parser.add_argument( -+ 'router_id', metavar='ROUTERID', -+ help='Router instance identifier.') -+ -+ return parser -+ -+ def take_action_network(self, client, parsed_args): -+ attrs = _get_attrs(self.app.client_manager, vars(parsed_args)) -+ router = client.find_router(attrs['router_id'], ignore_missing=False) -+ attrs['router_id'] = router.id -+ obj = client.create_portforwarding(**attrs) -+ display_columns, columns = _get_columns(obj) -+ data = utils.get_item_properties(obj, columns, formatters=_formatters) -+ return (display_columns, data) -+ -+ def take_action_compute(self, client, parsed_args): -+ raise exceptions.CommandError("This command needs access to" -+ " a network endpoint.") -+ return -+ -+ -+class DeletePortforwarding(common.NetworkAndComputeDelete): -+ """Delete portforwarding""" -+ -+ # Used by base class to find resources in parsed_args. -+ resource = 'portforwarding' -+ r = None -+ -+ def update_parser_common(self, parser): -+ parser.add_argument( -+ 'portforwarding', -+ metavar="", -+ nargs="+", -+ help=("Portforwarding to delete (ID)") -+ ) -+ return parser -+ -+ def take_action_network(self, client, parsed_args): -+ obj = client.find_portforwarding(self.r) -+ client.delete_portforwarding(obj) -+ -+ def take_action_compute(self, client, parsed_args): -+ raise exceptions.CommandError("This command needs access to" -+ " a network endpoint.") -+ return -+ -+ -+class UpdatePortforwarding(command.Command): -+ """Set portforwarding properties""" -+ -+ def get_parser(self, prog_name): -+ parser = super(UpdatePortforwarding, self).get_parser(prog_name) -+ parser.add_argument( -+ '--inside-addr', -+ help='Private IP address.') -+ parser.add_argument( -+ '--inside_addr', -+ help=argparse.SUPPRESS) -+ parser.add_argument( -+ '--inside-port', -+ help='Private layer4 protocol port.') -+ parser.add_argument( -+ '--inside_port', -+ help=argparse.SUPPRESS) -+ parser.add_argument( -+ '--outside-port', -+ help='Public layer4 protocol port.') -+ parser.add_argument( -+ '--outside_port', -+ help=argparse.SUPPRESS) -+ parser.add_argument( -+ '--protocol', -+ help='Layer4 protocol port number.') -+ parser.add_argument( -+ '--description', -+ help='User specified text description') -+ parser.add_argument( -+ 'portforwarding', metavar='PORTFORWARDING', -+ help='Portforwarding to delete (ID)') -+ return parser -+ -+ def take_action(self, parsed_args): -+ client = self.app.client_manager.network -+ obj = client.find_portforwarding(parsed_args.portforwarding, -+ ignore_missing=False) -+ attrs = _get_attrs(self.app.client_manager, vars(parsed_args)) -+ -+ if attrs == {}: -+ msg = "Nothing specified to be set" -+ raise exceptions.CommandError(msg) -+ client.update_portforwarding(obj, **attrs) -+ return -diff --git a/openstackclient/network/v2/providernet.py b/openstackclient/network/v2/providernet.py -new file mode 100644 -index 0000000..635eb64 ---- /dev/null -+++ b/openstackclient/network/v2/providernet.py -@@ -0,0 +1,302 @@ -+# 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. -+# -+# Copyright (c) 2016 Wind River Systems, Inc. -+# -+# -+# -+# -+# -+ -+"""Providernet action implementations""" -+ -+import argparse -+ -+from osc_lib.command import command -+from osc_lib import exceptions -+from osc_lib import utils -+from openstackclient.network import common -+from openstackclient.network import sdk_utils -+ -+ -+def add_boolean_argument(parser, name, **kwargs): -+ for keyword in ('metavar', 'choices'): -+ kwargs.pop(keyword, None) -+ default = kwargs.pop('default', argparse.SUPPRESS) -+ parser.add_argument( -+ name, -+ metavar='{True,False}', -+ choices=['True', 'true', 'False', 'false'], -+ default=default, -+ **kwargs) -+ -+ -+def _format_ranges(item): -+ item = utils.format_list_of_dicts(item) -+ # we want to remove some fields -+ # to match the output to neutron providernet-list -+ separator = ', ' -+ item = item.split(separator) -+ item = [s for s in item if "name" in s or "maximum" in s or "minimum" in s] -+ -+ return separator.join(item) -+ -+# the providernet list command does not display some values in the ranges field -+_filtered_ranges_formatters = { -+ 'ranges': _format_ranges -+} -+ -+_formatters = { -+ 'ranges': utils.format_list_of_dicts -+} -+ -+_net_list_on_providernet_formatters = { -+ 'vxlan': utils.format_dict -+} -+ -+ -+def _get_columns(item): -+ column_map = {} -+ return sdk_utils.get_osc_show_columns_for_sdk_resource(item, column_map) -+ -+ -+def _get_attrs(client_manager, parsed_args): -+ attrs = {key: parsed_args[key] for key in -+ ["name", "type", "vlan_transparent", "description", "mtu"] -+ if key in parsed_args} -+ if "mtu" in attrs and attrs["mtu"] is None: -+ del attrs["mtu"] -+ -+ return attrs -+ -+ -+class ListProvidernet(common.NetworkAndComputeLister): -+ """List providernets""" -+ -+ def update_parser_common(self, parser): -+ parser.add_argument( -+ '--type', -+ dest='type', -+ help='List all providernets of type') -+ return parser -+ -+ def take_action_network(self, client, parsed_args): -+ columns = ( -+ 'id', -+ 'name', -+ 'type', -+ 'mtu', -+ 'ranges' -+ ) -+ column_headers = ( -+ 'ID', -+ 'Name', -+ 'Type', -+ 'MTU', -+ 'Ranges' -+ ) -+ -+ args = _get_attrs(self.app.client_manager, vars(parsed_args)) -+ -+ data = client.providernets(**args) -+ -+ return (column_headers, -+ (utils.get_item_properties( -+ s, columns, -+ formatters=_filtered_ranges_formatters, -+ ) for s in data)) -+ -+ def take_action_compute(self, client, parsed_args): -+ raise exceptions.CommandError("This command needs access to" -+ " a network endpoint.") -+ return -+ -+ -+class ShowProvidernet(common.NetworkAndComputeShowOne): -+ """Show providernet details""" -+ -+ def update_parser_common(self, parser): -+ parser.add_argument( -+ 'providernet', -+ metavar="", -+ help=("Providernet to display (name or ID)") -+ ) -+ return parser -+ -+ def take_action_network(self, client, parsed_args): -+ obj = client.find_providernet(parsed_args.providernet, -+ ignore_missing=False) -+ display_columns, columns = _get_columns(obj) -+ data = utils.get_item_properties(obj, columns, formatters=_formatters) -+ return (display_columns, data) -+ -+ def take_action_compute(self, client, parsed_args): -+ raise exceptions.CommandError("This command needs access to" -+ " a network endpoint.") -+ return -+ -+ -+class CreateProvidernet(common.NetworkAndComputeShowOne): -+ """Create new providernet""" -+ -+ def update_parser_common(self, parser): -+ parser.add_argument( -+ '--description', -+ dest='description', -+ help='Set user-defined description field for a provider network') -+ parser.add_argument( -+ '--type', required=True, -+ dest='type', default='flat', -+ choices=['flat', 'vlan', 'vxlan'], -+ help='Set network type for a provider network') -+ parser.add_argument( -+ '--mtu', dest='mtu', type=int, -+ help='Maximum transmit unit on provider network') -+ add_boolean_argument( -+ parser, -+ '--vlan-transparent', -+ default='False', -+ help='Allow VLAN tagged packets on tenant networks') -+ parser.add_argument( -+ 'name', metavar='NAME', -+ help='Set user-defined name for a provider network') -+ -+ return parser -+ -+ def take_action_network(self, client, parsed_args): -+ attrs = _get_attrs(self.app.client_manager, vars(parsed_args)) -+ obj = client.create_providernet(**attrs) -+ display_columns, columns = _get_columns(obj) -+ data = utils.get_item_properties(obj, columns, formatters=_formatters) -+ return (display_columns, data) -+ -+ def take_action_compute(self, client, parsed_args): -+ raise exceptions.CommandError("This command needs access to" -+ " a network endpoint.") -+ return -+ -+ -+class DeleteProvidernet(common.NetworkAndComputeDelete): -+ """Delete providernet""" -+ -+ # Used by base class to find resources in parsed_args. -+ resource = 'providernet' -+ r = None -+ -+ def update_parser_common(self, parser): -+ parser.add_argument( -+ 'providernet', -+ metavar="", -+ nargs="+", -+ help=("Providernet to delete (name or ID)") -+ ) -+ return parser -+ -+ def take_action_network(self, client, parsed_args): -+ obj = client.find_providernet(self.r) -+ client.delete_providernet(obj) -+ -+ def take_action_compute(self, client, parsed_args): -+ raise exceptions.CommandError("This command needs access to" -+ " a network endpoint.") -+ return -+ -+ -+class UpdateProvidernet(command.Command): -+ """Set providernet properties""" -+ -+ def get_parser(self, prog_name): -+ parser = super(UpdateProvidernet, self).get_parser(prog_name) -+ parser.add_argument( -+ '--description', -+ dest='description', -+ help='Set user-defined description field for a provider network') -+ parser.add_argument( -+ '--mtu', dest='mtu', type=int, -+ help='Maximum transmit unit on provider network') -+ add_boolean_argument( -+ parser, -+ '--vlan-transparent', -+ help='Allow VLAN tagged packets on tenant networks') -+ parser.add_argument( -+ 'providernet', metavar='PROVIDERNET', -+ help='Set user-defined name for a provider network') -+ -+ return parser -+ -+ def take_action(self, parsed_args): -+ client = self.app.client_manager.network -+ -+ obj = client.find_providernet(parsed_args.providernet, -+ ignore_missing=False) -+ attrs = _get_attrs(self.app.client_manager, vars(parsed_args)) -+ if attrs == {}: -+ msg = "Nothing specified to be set" -+ raise exceptions.CommandError(msg) -+ -+ client.update_providernet(obj, **attrs) -+ return -+ -+ -+class NetListOnProvidernet(common.NetworkAndComputeLister): -+ """List the networks on a provider network.""" -+ -+ def update_parser_common(self, parser): -+ parser.add_argument( -+ 'providernet', -+ metavar="", -+ help=("Providernet to display (name or ID)") -+ ) -+ return parser -+ -+ def take_action_network(self, client, parsed_args): -+ obj = client.find_providernet(parsed_args.providernet, -+ ignore_missing=False) -+ providernet_id = obj.id -+ -+ columns = ( -+ 'id', -+ 'name', -+ 'vlan_id', -+ 'providernet_type', -+ 'segmentation_id', -+ 'vxlan', -+ ) -+ column_headers = ( -+ 'ID', -+ 'Name', -+ 'VLAN ID', -+ 'Providernet Type', -+ 'Segmentation ID', -+ 'Providernet Attributes' -+ ) -+ -+ args = {} -+ -+ # cheated a bit here, doing the same request as a providernet list, -+ # except using providernet_id/providernet-bindings -+ # as the base path. Openstack client framwork does not support what -+ # we need in terms of editing the address at the -+ # time of implementing this -+ data = client.net_list_on_providernet(providernet_id + -+ "/providernet-bindings", **args) -+ -+ return (column_headers, -+ (utils.get_item_properties( -+ s, columns, -+ formatters=_net_list_on_providernet_formatters, -+ ) for s in data)) -+ -+ def take_action_compute(self, client, parsed_args): -+ raise exceptions.CommandError("This command needs access to" -+ " a network endpoint.") -+ return -diff --git a/openstackclient/network/v2/providernet_connectivity_test.py b/openstackclient/network/v2/providernet_connectivity_test.py -new file mode 100644 -index 0000000..e879ec2 ---- /dev/null -+++ b/openstackclient/network/v2/providernet_connectivity_test.py -@@ -0,0 +1,220 @@ -+# 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. -+# -+# Copyright (c) 2016 Wind River Systems, Inc. -+# -+# -+# -+# -+# -+ -+"""Providernet connectivity test action implementations""" -+ -+import itertools -+from osc_lib import exceptions -+from osc_lib import utils -+from openstackclient.network import common -+from openstackclient.network import sdk_utils -+ -+_formatters = { -+} -+ -+ -+def _get_columns(item): -+ column_map = {} -+ invisible_columns = ["host_id", "host_name", "id", "message", "name", -+ "providernet_id", "providernet_name", -+ "segmentation_id", "status", "type", "updated_at"] -+ return sdk_utils.get_osc_show_columns_for_sdk_resource(item, column_map, -+ invisible_columns) -+ -+ -+def _get_attrs(client_manager, parsed_args, client): -+ attrs = {key: parsed_args[key] for key in -+ ["providernet", "host", "segmentation_id", "audit_uuid"] -+ if key in parsed_args and parsed_args[key] is not None} -+ if "providernet" in attrs: -+ providernet = client.find_providernet(attrs.pop("providernet"), -+ ignore_missing=False) -+ attrs["providernet_id"] = providernet.id -+ if "host" in attrs: -+ host = client.find_host(attrs.pop("host"), ignore_missing=False) -+ attrs["host_id"] = host.id -+ return attrs -+ -+ -+# copied from neutron client and modified to fit data formats here -+def _list_segments(segments): -+ """Takes a list of segments, and outputs them as a string""" -+ msg = ", ".join([str(x or "*") for x in sorted(segments)]) -+ return msg -+ -+ -+# copied from neutron client and modified to fit data formats here -+def _group_segmentation_id_list(segmentation_ids): -+ """Takes a list of integers and groups them into ranges""" -+ if len(segmentation_ids) < 1: -+ return "" -+ try: -+ sorted_segmentation_ids = sorted( -+ [int(segmentation_id) for segmentation_id in segmentation_ids] -+ ) -+ except Exception: -+ return _list_segments(segmentation_ids) -+ grouped_ids = [tuple(g[1]) for g in itertools.groupby( -+ enumerate(sorted_segmentation_ids), lambda (i, n): i - n -+ )] -+ msg = ", ".join( -+ [(("%s-%s" % (g[0][1], g[-1][1])) if g[0][1] != g[-1][1] -+ else ("%s" % g[0][1])) for g in grouped_ids] -+ ) -+ return msg -+ -+ -+# copied from neutron client and modified to fit data formats here -+def _format_connectivity_results(data): -+ """Takes a list of results, and formats them for reporting -+ -+ order assumed: providernet_id, providernet_name, type, host_name, -+ segmentation_id, status, message -+ """ -+ -+ parsed_results = {} -+ has_message = False -+ for result in data: -+ providernet_id = result.providernet_id -+ providernet_name = result.providernet_name -+ providernet_type = result.type -+ hostname = result.host_name -+ if hasattr(result, "segmentation_id"): -+ segmentation_id = result.segmentation_id -+ else: -+ segmentation_id = None -+ status = result.status -+ message = result.message -+ if message: -+ has_message = True -+ test = (providernet_id, providernet_name, providernet_type, -+ hostname, status, message) -+ if test not in parsed_results: -+ parsed_results[test] = [] -+ parsed_results[test].append(segmentation_id) -+ -+ formatted_results = [] -+ for test, results in parsed_results.iteritems(): -+ (providernet_id, providernet_name, providernet_type, -+ hostname, status, message) = test -+ formatted_segmentation_ids = \ -+ _group_segmentation_id_list(results) -+ -+ if has_message: -+ formatted_result = (providernet_id, -+ providernet_name, -+ providernet_type, -+ hostname, -+ formatted_segmentation_ids, -+ status, -+ message -+ ) -+ else: -+ formatted_result = (providernet_id, -+ providernet_name, -+ providernet_type, -+ hostname, -+ formatted_segmentation_ids, -+ status -+ ) -+ formatted_results.append(formatted_result) -+ -+ return tuple(formatted_results), has_message -+ -+ -+class ListProvidernetConnectivityTest(common.NetworkAndComputeLister): -+ """List providernet connectivity tests""" -+ -+ def update_parser_common(self, parser): -+ parser.add_argument( -+ '--audit-uuid', -+ dest='audit_uuid', default=None, -+ help='List only for this audit-uuid') -+ parser.add_argument( -+ '--providernet', -+ dest='providernet', default=None, -+ help='List only for this providernet') -+ parser.add_argument( -+ '--host', -+ dest='host', default=None, -+ help='List only for this host') -+ parser.add_argument( -+ '--segmentation-id', -+ dest='segmentation_id', default=None, -+ help='List only for this segmentation-id') -+ return parser -+ -+ def take_action_network(self, client, parsed_args): -+ column_headers = ( -+ 'Providernet ID', -+ 'Providernet Name', -+ 'Type', -+ 'Host Name', -+ 'Segmentation IDs', -+ 'Status' -+ ) -+ args = _get_attrs(self.app.client_manager, vars(parsed_args), client) -+ -+ data = client.providernet_connectivity_tests(**args) -+ formatted_data, has_message = _format_connectivity_results(data) -+ -+ # replicate behavior from neutron command: -+ # dont show message column if it does not exist -+ if has_message: -+ column_headers = column_headers + ('Message',) -+ -+ return (column_headers, -+ formatted_data) -+ -+ def take_action_compute(self, client, parsed_args): -+ raise exceptions.CommandError("This command needs access to" -+ " a network endpoint.") -+ return -+ -+ -+class CreateProvidernetConnectivityTest(common.NetworkAndComputeShowOne): -+ """Create new providernet connectivity test""" -+ -+ def update_parser_common(self, parser): -+ parser.add_argument( -+ '--providernet', -+ dest='providernet', default=None, -+ help=('Schedule audit for given providernet')) -+ parser.add_argument( -+ '--host', -+ dest='host', default=None, -+ help='Schedule audits for all providernets on host') -+ parser.add_argument( -+ '--segmentation-id', -+ dest='segmentation_id', default=None, -+ help='Schedule for this segmentation ID') -+ -+ return parser -+ -+ def take_action_network(self, client, parsed_args): -+ attrs = _get_attrs(self.app.client_manager, vars(parsed_args), client) -+ obj = client.create_providernet_connectivity_test(**attrs) -+ display_columns, columns = _get_columns(obj) -+ data = utils.get_item_properties(obj, columns, formatters=_formatters) -+ return (display_columns, data) -+ -+ def take_action_compute(self, client, parsed_args): -+ raise exceptions.CommandError("This command needs access to" -+ " a network endpoint.") -+ return -diff --git a/openstackclient/network/v2/providernet_range.py b/openstackclient/network/v2/providernet_range.py -new file mode 100644 -index 0000000..8748c4c ---- /dev/null -+++ b/openstackclient/network/v2/providernet_range.py -@@ -0,0 +1,272 @@ -+# 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. -+# -+# Copyright (c) 2016 Wind River Systems, Inc. -+# -+# -+# -+# -+# -+ -+"""Providernet range action implementations""" -+ -+import argparse -+from osc_lib.command import command -+from osc_lib import exceptions -+from osc_lib import utils -+from openstackclient.i18n import _ -+from openstackclient.identity import common as identity_common -+from openstackclient.network import common -+from openstackclient.network import sdk_utils -+ -+_formatters = { -+ 'vxlan': utils.format_dict -+} -+ -+ -+def _get_columns(item): -+ column_map = {} -+ return sdk_utils.get_osc_show_columns_for_sdk_resource(item, column_map) -+ -+ -+def _get_attrs(client_manager, parsed_args): -+ attrs = {key: parsed_args[key] for key in -+ ["shared", "description", "name", "group", "ttl", "port", "mode", -+ "providernet_id", "providernet_range_id"] -+ if key in parsed_args} -+ if "range" in parsed_args and parsed_args["range"] is not None: -+ attrs["maximum"] = parsed_args["range"]["maximum"] -+ attrs["minimum"] = parsed_args["range"]["minimum"] -+ if "port" in attrs and attrs["port"] is None: -+ del attrs["port"] -+ if "ttl" in attrs and attrs["ttl"] is None: -+ del attrs["ttl"] -+ if "group" in attrs and attrs["group"] is None: -+ del attrs["group"] -+ if "mode" in attrs and attrs["mode"] is None: -+ del attrs["mode"] -+ if 'project' in parsed_args and parsed_args["project"] is not None: -+ identity_client = client_manager.identity -+ project_id = identity_common.find_project( -+ identity_client, -+ parsed_args["project"] -+ ).id -+ # TODO(dtroyer): Remove tenant_id when we clean up the SDK refactor -+ attrs['tenant_id'] = project_id -+ attrs['project_id'] = project_id -+ -+ return attrs -+ -+ -+def _id_range_value(value): -+ range_list = value.split('-') -+ if (len(range_list) != 2): -+ raise argparse.ArgumentTypeError( -+ 'Expecting MIN_VALUE-MAX_VALUE in range list') -+ return {'minimum': range_list[0], -+ 'maximum': range_list[1]} -+ -+ -+class ListProvidernetRange(common.NetworkAndComputeLister): -+ """List providernet ranges""" -+ -+ def update_parser_common(self, parser): -+ parser.add_argument( -+ '--project', -+ metavar='', -+ help=_("Owner's project (name or ID)") -+ ) -+ return parser -+ -+ def take_action_network(self, client, parsed_args): -+ columns = ( -+ 'id', -+ 'name', -+ 'providernet_name', -+ 'providernet_type', -+ 'minimum', -+ 'maximum', -+ 'vxlan' -+ ) -+ column_headers = ( -+ 'ID', -+ 'Name', -+ 'Providernet', -+ 'Type', -+ 'Minimum', -+ 'Maximum', -+ 'Attributes' -+ ) -+ -+ args = _get_attrs(self.app.client_manager, vars(parsed_args)) -+ -+ data = client.providernet_ranges(**args) -+ -+ return (column_headers, -+ (utils.get_item_properties( -+ s, columns, -+ formatters=_formatters, -+ ) for s in data)) -+ -+ def take_action_compute(self, client, parsed_args): -+ raise exceptions.CommandError("This command needs access to" -+ " a network endpoint.") -+ return -+ -+ -+class ShowProvidernetRange(common.NetworkAndComputeShowOne): -+ """Show providernet range details""" -+ -+ def update_parser_common(self, parser): -+ parser.add_argument( -+ 'providernet_range', -+ metavar="", -+ help=("Providernet range to display (name or ID)") -+ ) -+ return parser -+ -+ def take_action_network(self, client, parsed_args): -+ obj = client.find_providernet_range(parsed_args.providernet_range, -+ ignore_missing=False) -+ display_columns, columns = _get_columns(obj) -+ data = utils.get_item_properties(obj, columns, formatters=_formatters) -+ return (display_columns, data) -+ -+ def take_action_compute(self, client, parsed_args): -+ raise exceptions.CommandError("This command needs access to" -+ " a network endpoint.") -+ return -+ -+ -+class CreateProvidernetRange(common.NetworkAndComputeShowOne): -+ """Create new providernet range""" -+ -+ def update_parser_common(self, parser): -+ parser.add_argument( -+ '--shared', -+ dest='shared', action='store_true', default=False, -+ help=('Set whether a provider network segmentation id range ' -+ 'may be shared between tenants')) -+ parser.add_argument( -+ '--project', -+ metavar='', -+ help=_("Owner's project (name or ID)") -+ ) -+ identity_common.add_project_domain_option_to_parser(parser) -+ parser.add_argument( -+ '--description', -+ dest='description', -+ help='Set user-defined description field for a provider network') -+ parser.add_argument( -+ '--range', metavar='MIN_VALUE-MAX_VALUE', required=True, -+ dest='range', type=_id_range_value, -+ help='Segmentation id value range') -+ parser.add_argument( -+ '--name', required=True, -+ dest='name', -+ help=('Set user-defined name for a provider network ' -+ 'segmentation id range')) -+ parser.add_argument( -+ '--group', -+ dest='group', -+ help='Multicast IP addresses for VXLAN endpoints') -+ parser.add_argument( -+ '--ttl', dest='ttl', type=int, -+ help='Time-to-live value for VXLAN provider networks') -+ parser.add_argument( -+ '--port', dest='port', type=int, -+ help=('Destination UDP port value to use for ' -+ 'VXLAN provider networks')) -+ parser.add_argument( -+ '--mode', -+ dest='mode', default='dynamic', -+ choices=['dynamic', 'static', 'evpn'], -+ help='Set vxlan learning mode') -+ parser.add_argument( -+ 'providernet_id', metavar='PROVIDERNET', -+ help='Provider network this segmentation id range belongs to') -+ -+ return parser -+ -+ def take_action_network(self, client, parsed_args): -+ attrs = _get_attrs(self.app.client_manager, vars(parsed_args)) -+ obj = client.find_providernet(parsed_args.providernet_id, -+ ignore_missing=False) -+ attrs["providernet_id"] = obj.id -+ obj = client.create_providernet_range(**attrs) -+ display_columns, columns = _get_columns(obj) -+ data = utils.get_item_properties(obj, columns, formatters=_formatters) -+ return (display_columns, data) -+ -+ def take_action_compute(self, client, parsed_args): -+ raise exceptions.CommandError("This command needs access to" -+ " a network endpoint.") -+ return -+ -+ -+class DeleteProvidernetRange(common.NetworkAndComputeDelete): -+ """Delete providernet range""" -+ -+ # Used by base class to find resources in parsed_args. -+ resource = 'providernet_range' -+ r = None -+ -+ def update_parser_common(self, parser): -+ parser.add_argument( -+ 'providernet_range', -+ metavar="", -+ nargs="+", -+ help=("Providernet to Delete (name or ID)") -+ ) -+ return parser -+ -+ def take_action_network(self, client, parsed_args): -+ obj = client.find_providernet_range(self.r) -+ client.delete_providernet_range(obj) -+ -+ def take_action_compute(self, client, parsed_args): -+ raise exceptions.CommandError("This command needs access to" -+ " a network endpoint.") -+ return -+ -+ -+class UpdateProvidernetRange(command.Command): -+ """Set providernet range properties""" -+ -+ def get_parser(self, prog_name): -+ parser = super(UpdateProvidernetRange, self).get_parser(prog_name) -+ parser.add_argument( -+ '--description', -+ dest='description', -+ help='Set user-defined description field for a provider network') -+ parser.add_argument( -+ '--range', metavar='MIN_VALUE-MAX_VALUE', -+ dest='range', type=_id_range_value, -+ help='Segmentation id value range') -+ parser.add_argument( -+ 'providernet_range_id', metavar='PROVIDERNET_RANGE', -+ help='Name or ID of this providernet range') -+ return parser -+ -+ def take_action(self, parsed_args): -+ client = self.app.client_manager.network -+ obj = client.find_providernet_range(parsed_args.providernet_range_id, -+ ignore_missing=False) -+ -+ attrs = _get_attrs(self.app.client_manager, vars(parsed_args)) -+ del attrs['providernet_range_id'] -+ -+ if attrs == {}: -+ msg = "Nothing specified to be set" -+ raise exceptions.CommandError(msg) -+ client.update_providernet_range(obj, **attrs) -+ return -diff --git a/openstackclient/network/v2/providernet_type.py b/openstackclient/network/v2/providernet_type.py -new file mode 100644 -index 0000000..2abd8c4 ---- /dev/null -+++ b/openstackclient/network/v2/providernet_type.py -@@ -0,0 +1,60 @@ -+# 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. -+# -+# Copyright (c) 2016 Wind River Systems, Inc. -+# -+# -+# -+# -+# -+ -+"""Providernet type action implementations""" -+ -+from osc_lib import exceptions -+from osc_lib import utils -+from openstackclient.network import common -+from openstackclient.network import sdk_utils -+ -+_formatters = { -+} -+ -+ -+class ListProvidernetType(common.NetworkAndComputeLister): -+ """List providernet types""" -+ -+ def update_parser_common(self, parser): -+ return parser -+ -+ def take_action_network(self, client, parsed_args): -+ columns = ( -+ 'type', -+ 'description' -+ ) -+ column_headers = ( -+ 'Type', -+ 'Description' -+ ) -+ -+ args = {} -+ -+ data = client.providernet_types(**args) -+ -+ return (column_headers, -+ (utils.get_item_properties( -+ s, columns, -+ formatters=_formatters, -+ ) for s in data)) -+ -+ def take_action_compute(self, client, parsed_args): -+ raise exceptions.CommandError("This command needs access to" -+ " a network endpoint.") -+ return -diff --git a/openstackclient/network/v2/router.py b/openstackclient/network/v2/router.py -index 4f90853..4eb5908 100644 ---- a/openstackclient/network/v2/router.py -+++ b/openstackclient/network/v2/router.py -@@ -68,6 +68,7 @@ def _get_columns(item): - 'is_ha': 'ha', - 'is_distributed': 'distributed', - 'is_admin_state_up': 'admin_state_up', -+ 'host': 'wrs-net:host', - } - return sdk_utils.get_osc_show_columns_for_sdk_resource(item, column_map) - -diff --git a/openstackclient/network/v2/setting.py b/openstackclient/network/v2/setting.py -new file mode 100644 -index 0000000..d404325 ---- /dev/null -+++ b/openstackclient/network/v2/setting.py -@@ -0,0 +1,183 @@ -+# 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. -+# -+# Copyright (c) 2016 Wind River Systems, Inc. -+# -+# -+# -+# -+# -+ -+"""Settings action implementations""" -+ -+from osc_lib.command import command -+from osc_lib import exceptions -+from osc_lib import utils -+from openstackclient.i18n import _ -+from openstackclient.identity import common as identity_common -+from openstackclient.network import common -+from openstackclient.network import sdk_utils -+ -+_formatters = {} -+ -+ -+def _get_columns(item): -+ column_map = {"id": "project_id"} -+ invisible_columns = ["name"] -+ return sdk_utils.get_osc_show_columns_for_sdk_resource(item, column_map, -+ invisible_columns) -+ -+ -+def _get_attrs(client_manager, parsed_args): -+ attrs = {key: parsed_args[key] for key in ["mac_filtering"] -+ if key in parsed_args} -+ -+ if 'project' in parsed_args and parsed_args["project"] is not None: -+ identity_client = client_manager.identity -+ project_id = identity_common.find_project( -+ identity_client, -+ parsed_args["project"] -+ ).id -+ attrs['project_id'] = project_id -+ -+ return attrs -+ -+ -+class ListSetting(common.NetworkAndComputeLister): -+ """List settings of all projects who have non-default setting values""" -+ -+ def update_parser_common(self, parser): -+ return parser -+ -+ def take_action_network(self, client, parsed_args): -+ columns = ( -+ 'mac_filtering', -+ 'project_id' -+ ) -+ column_headers = ( -+ 'Mac Filtering', -+ 'Project ID' -+ ) -+ -+ args = {} -+ -+ data = client.settings(**args) -+ -+ return (column_headers, -+ (utils.get_item_properties( -+ s, columns, -+ formatters=_formatters, -+ ) for s in data)) -+ -+ def take_action_compute(self, client, parsed_args): -+ raise exceptions.CommandError("This command needs access to" -+ " a network endpoint.") -+ return -+ -+ -+class ShowSetting(common.NetworkAndComputeShowOne): -+ """Show settings of a given project""" -+ -+ def update_parser_common(self, parser): -+ parser.add_argument( -+ '--project', -+ metavar='', -+ help=_("Owner's project (name or ID)"), -+ required=False -+ ) -+ return parser -+ -+ def take_action_network(self, client, parsed_args): -+ client = self.app.client_manager.network -+ # if no project id is specified, operate on current project -+ args = _get_attrs(self.app.client_manager, vars(parsed_args)) -+ if not "project_id" in args: -+ args["project_id"] = client.find_tenant().project_id -+ project_id = args["project_id"] -+ -+ obj = client.find_setting(project_id, ignore_missing=False) -+ -+ display_columns, columns = _get_columns(obj) -+ data = utils.get_item_properties(obj, columns, formatters=_formatters) -+ return (display_columns, data) -+ -+ def take_action_compute(self, client, parsed_args): -+ raise exceptions.CommandError("This command needs access to" -+ " a network endpoint.") -+ return -+ -+ -+# this one uses NetworkAndComputeCommand because settings can be deleted -+# without a project id -+class DeleteSetting(common.NetworkAndComputeCommand): -+ """Delete setting""" -+ -+ def update_parser_common(self, parser): -+ parser.add_argument( -+ '--project', -+ metavar='', -+ help=_("Owner's project (name or ID)"), -+ required=False -+ ) -+ return parser -+ -+ def take_action_network(self, client, parsed_args): -+ client = self.app.client_manager.network -+ # if no project id is specified, operate on current project -+ args = _get_attrs(self.app.client_manager, vars(parsed_args)) -+ if not "project_id" in args: -+ args["project_id"] = client.find_tenant().project_id -+ project_id = args["project_id"] -+ -+ client.delete_setting(project_id) -+ return -+ -+ def take_action_compute(self, client, parsed_args): -+ raise exceptions.CommandError("This command needs " -+ "access to a network endpoint.") -+ return -+ -+ -+class UpdateSetting(command.Command): -+ """Set setting properties""" -+ -+ def get_parser(self, prog_name): -+ parser = super(UpdateSetting, self).get_parser(prog_name) -+ parser.add_argument( -+ '--project', -+ metavar='', -+ help=_("Owner's project (name or ID)"), -+ required=False -+ ) -+ parser.add_argument('--mac-filtering', metavar='mac_filtering', -+ help="Enable/Disable source MAC filtering" -+ " on all ports", -+ required=True) -+ return parser -+ -+ def take_action(self, parsed_args): -+ client = self.app.client_manager.network -+ # if no project id is specified, operate on current project -+ args = _get_attrs(self.app.client_manager, vars(parsed_args)) -+ if not "project_id" in args: -+ args["project_id"] = client.find_tenant().project_id -+ project_id = args["project_id"] -+ del args['project_id'] -+ -+ client.find_setting(project_id, ignore_missing=False) -+ -+ if args == {}: -+ msg = "Nothing specified to be set" -+ raise exceptions.CommandError(msg) -+ -+ client.update_setting(project_id, **args) -+ return -diff --git a/openstackclient/network/v2/subnet.py b/openstackclient/network/v2/subnet.py -index b96dff7..864c832 100644 ---- a/openstackclient/network/v2/subnet.py -+++ b/openstackclient/network/v2/subnet.py -@@ -13,7 +13,9 @@ - - """Subnet action implementations""" - -+import argparse - import copy -+import functools - import logging - - from osc_lib.cli import parseractions -@@ -27,6 +29,10 @@ from openstackclient.network import sdk_utils - from openstackclient.network.v2 import _tag - - -+MIN_VLAN_TAG = 1 -+MAX_VLAN_TAG = 4094 -+ -+ - LOG = logging.getLogger(__name__) - - -@@ -233,9 +239,36 @@ def _get_attrs(client_manager, parsed_args, is_create=True): - attrs['service_types'] = parsed_args.service_types - if parsed_args.description is not None: - attrs['description'] = parsed_args.description -+ -+ # wrs extensions -+ if ('vlan_id' in parsed_args and -+ parsed_args.vlan_id is not None): -+ attrs['wrs-net:vlan_id'] = parsed_args.vlan_id -+ if ('network_type' in parsed_args and -+ parsed_args.network_type is not None): -+ attrs['wrs-provider:network_type'] = parsed_args.network_type -+ if ('physical_network' in parsed_args and -+ parsed_args.physical_network is not None): -+ attrs['wrs-provider:vlan_id'] = parsed_args.physical_network -+ if ('segmentation_id' in parsed_args and -+ parsed_args.segmentation_id is not None): -+ attrs['wrs-provider:segmentation_id'] = parsed_args.segmentation_id -+ if ('unmanaged' in parsed_args and -+ parsed_args.unmanaged is not False): -+ attrs['wrs-net:managed'] = False -+ - return attrs - - -+def _check_vlan_id(value): -+ vlan_id = int(value) -+ if vlan_id < MIN_VLAN_TAG or vlan_id > MAX_VLAN_TAG: -+ raise argparse.ArgumentTypeError( -+ "VLAN ID must be between {} and {}".format( -+ MIN_VLAN_TAG, MAX_VLAN_TAG)) -+ return vlan_id -+ -+ - # TODO(abhiraut): Use the SDK resource mapped attribute names once the - # OSC minimum requirements include SDK 1.0. - class CreateSubnet(command.ShowOne): -@@ -337,6 +370,27 @@ class CreateSubnet(command.ShowOne): - metavar='', - help=_("Set subnet description") - ) -+ parser.add_argument( -+ '--wrs-net:vlan_id', -+ dest='vlan_id', -+ type=_check_vlan_id, -+ help='VLAN ID of the subnet') -+ parser.add_argument( -+ '--wrs-provider:network_type', -+ dest='network_type', -+ help='Provider network type (admin only)') -+ parser.add_argument( -+ '--wrs-provider:physical_network', -+ dest='physical_network', -+ help='Provider network name (admin only)') -+ parser.add_argument( -+ '--wrs-provider:segmentation_id', -+ dest='segmentation_id', -+ help='Provider network segmentation id (admin only)') -+ parser.add_argument( -+ '--unmanaged', -+ action='store_true', -+ help='Disable IP allocation on this subnet') - _get_common_parse_arguments(parser) - _tag.add_tag_option_to_parser_for_create(parser, _('subnet')) - return parser -@@ -497,14 +551,16 @@ class ListSubnet(command.Lister): - _tag.get_tag_filtering_args(parsed_args, filters) - data = network_client.subnets(**filters) - -- headers = ('ID', 'Name', 'Network', 'Subnet') -- columns = ('id', 'name', 'network_id', 'cidr') -+ headers = ('ID', 'Name', 'Network', 'Subnet', 'Allocation Pools', -+ 'WRS-Net:VLAN ID') -+ columns = ('id', 'name', 'network_id', 'cidr', 'allocation_pools', -+ 'wrs-net:vlan_id') - if parsed_args.long: - headers += ('Project', 'DHCP', 'Name Servers', -- 'Allocation Pools', 'Host Routes', 'IP Version', -+ 'Host Routes', 'IP Version', - 'Gateway', 'Service Types', 'Tags') - columns += ('project_id', 'is_dhcp_enabled', 'dns_nameservers', -- 'allocation_pools', 'host_routes', 'ip_version', -+ 'host_routes', 'ip_version', - 'gateway_ip', 'service_types', 'tags') - - return (headers, -diff --git a/openstackclient/tests/unit/network/v2/fakes.py b/openstackclient/tests/unit/network/v2/fakes.py -index eadab58..0d53fc5 100644 ---- a/openstackclient/tests/unit/network/v2/fakes.py -+++ b/openstackclient/tests/unit/network/v2/fakes.py -@@ -1244,7 +1244,8 @@ class FakeSecurityGroupRule(object): - - @staticmethod - def get_security_group_rules(security_group_rules=None, count=2): -- """Get an iterable Mock object with a list of faked security group rules. -+ """Get an iterable Mock object with a list of faked security group -+ rules. - - If security group rules list is provided, then initialize the Mock - object with the list. Otherwise create one. -@@ -1298,6 +1299,7 @@ class FakeSubnet(object): - 'subnetpool_id': None, - 'description': 'subnet-description-' + uuid.uuid4().hex, - 'tags': [], -+ 'wrs-net:vlan_id': '1', - } - - # Overwrite default attributes. -diff --git a/openstackclient/tests/unit/network/v2/test_subnet.py b/openstackclient/tests/unit/network/v2/test_subnet.py -index c96d680..a4c8914 100644 ---- a/openstackclient/tests/unit/network/v2/test_subnet.py -+++ b/openstackclient/tests/unit/network/v2/test_subnet.py -@@ -126,6 +126,7 @@ class TestCreateSubnet(TestSubnet): - 'service_types', - 'subnetpool_id', - 'tags', -+ 'wrs-net:vlan_id', - ) - - data = ( -@@ -147,6 +148,7 @@ class TestCreateSubnet(TestSubnet): - utils.format_list(_subnet.service_types), - _subnet.subnetpool_id, - utils.format_list(_subnet.tags), -+ getattr(_subnet, 'wrs-net:vlan_id', ''), - ) - - data_subnet_pool = ( -@@ -168,6 +170,7 @@ class TestCreateSubnet(TestSubnet): - utils.format_list(_subnet_from_pool.service_types), - _subnet_from_pool.subnetpool_id, - utils.format_list(_subnet.tags), -+ getattr(_subnet_from_pool, 'wrs-net:vlan_id', ''), - ) - - data_ipv6 = ( -@@ -189,6 +192,7 @@ class TestCreateSubnet(TestSubnet): - utils.format_list(_subnet_ipv6.service_types), - _subnet_ipv6.subnetpool_id, - utils.format_list(_subnet.tags), -+ getattr(_subnet_ipv6, 'wrs-net:vlan_id', ''), - ) - - def setUp(self): -@@ -589,12 +593,13 @@ class TestListSubnet(TestSubnet): - 'Name', - 'Network', - 'Subnet', -+ 'Allocation Pools', -+ 'WRS-Net:VLAN ID', - ) - columns_long = columns + ( - 'Project', - 'DHCP', - 'Name Servers', -- 'Allocation Pools', - 'Host Routes', - 'IP Version', - 'Gateway', -@@ -609,6 +614,8 @@ class TestListSubnet(TestSubnet): - subnet.name, - subnet.network_id, - subnet.cidr, -+ subnet_v2._format_allocation_pools(subnet.allocation_pools), -+ getattr(subnet, 'wrs-net:vlan_id', ''), - )) - - data_long = [] -@@ -618,10 +625,11 @@ class TestListSubnet(TestSubnet): - subnet.name, - subnet.network_id, - subnet.cidr, -+ subnet_v2._format_allocation_pools(subnet.allocation_pools), -+ getattr(subnet, 'wrs-net:vlan_id', ''), - subnet.tenant_id, - subnet.enable_dhcp, - utils.format_list(subnet.dns_nameservers), -- subnet_v2._format_allocation_pools(subnet.allocation_pools), - utils.format_list(subnet.host_routes), - subnet.ip_version, - subnet.gateway_ip, -@@ -1093,6 +1101,7 @@ class TestShowSubnet(TestSubnet): - 'service_types', - 'subnetpool_id', - 'tags', -+ 'wrs-net:vlan_id', - ) - - data = ( -@@ -1114,6 +1123,7 @@ class TestShowSubnet(TestSubnet): - utils.format_list(_subnet.service_types), - _subnet.subnetpool_id, - utils.format_list(_subnet.tags), -+ getattr(_subnet, 'wrs-net:vlan_id', ''), - ) - - def setUp(self): -diff --git a/setup.cfg b/setup.cfg -index 0afa479..1bff735 100644 ---- a/setup.cfg -+++ b/setup.cfg -@@ -398,6 +398,34 @@ openstack.network.v2 = - subnet_pool_set = openstackclient.network.v2.subnet_pool:SetSubnetPool - subnet_pool_show = openstackclient.network.v2.subnet_pool:ShowSubnetPool - subnet_pool_unset = openstackclient.network.v2.subnet_pool:UnsetSubnetPool -+ providernet_list = openstackclient.network.v2.providernet:ListProvidernet -+ providernet_show = openstackclient.network.v2.providernet:ShowProvidernet -+ providernet_create = openstackclient.network.v2.providernet:CreateProvidernet -+ providernet_update = openstackclient.network.v2.providernet:UpdateProvidernet -+ providernet_delete = openstackclient.network.v2.providernet:DeleteProvidernet -+ providernet_range_list = openstackclient.network.v2.providernet_range:ListProvidernetRange -+ providernet_range_show = openstackclient.network.v2.providernet_range:ShowProvidernetRange -+ providernet_range_create = openstackclient.network.v2.providernet_range:CreateProvidernetRange -+ providernet_range_update = openstackclient.network.v2.providernet_range:UpdateProvidernetRange -+ providernet_range_delete = openstackclient.network.v2.providernet_range:DeleteProvidernetRange -+ portforwarding_list = openstackclient.network.v2.portforwarding:ListPortforwarding -+ portforwarding_show = openstackclient.network.v2.portforwarding:ShowPortforwarding -+ portforwarding_create = openstackclient.network.v2.portforwarding:CreatePortforwarding -+ portforwarding_update = openstackclient.network.v2.portforwarding:UpdatePortforwarding -+ portforwarding_delete = openstackclient.network.v2.portforwarding:DeletePortforwarding -+ setting_list = openstackclient.network.v2.setting:ListSetting -+ setting_show = openstackclient.network.v2.setting:ShowSetting -+ setting_update = openstackclient.network.v2.setting:UpdateSetting -+ setting_delete = openstackclient.network.v2.setting:DeleteSetting -+ net_host_list = openstackclient.network.v2.host:ListHost -+ net_host_show = openstackclient.network.v2.host:ShowHost -+ net_host_create = openstackclient.network.v2.host:CreateHost -+ net_host_update = openstackclient.network.v2.host:UpdateHost -+ net_host_delete = openstackclient.network.v2.host:DeleteHost -+ providernet_type_list = openstackclient.network.v2.providernet_type:ListProvidernetType -+ providernet_connectivity_test_list = openstackclient.network.v2.providernet_connectivity_test:ListProvidernetConnectivityTest -+ providernet_connectivity_test_schedule = openstackclient.network.v2.providernet_connectivity_test:CreateProvidernetConnectivityTest -+ net_list_on_providernet = openstackclient.network.v2.providernet:NetListOnProvidernet - openstack.object_store.v1 = - object_store_account_set = openstackclient.object.v1.account:SetAccount - object_store_account_show = openstackclient.object.v1.account:ShowAccount diff --git a/openstack/python-openstackclient/centos/patches/0002-Add-support-for-endpoing-filter-commands.patch b/openstack/python-openstackclient/centos/patches/0002-Add-support-for-endpoing-filter-commands.patch deleted file mode 100644 index 8e201e4d..00000000 --- a/openstack/python-openstackclient/centos/patches/0002-Add-support-for-endpoing-filter-commands.patch +++ /dev/null @@ -1,614 +0,0 @@ -From 8d106e1f1b3e536127818e98e495343e3c85f6b1 Mon Sep 17 00:00:00 2001 -From: Jose Castro Leon -Date: Wed, 25 Oct 2017 15:39:44 +0200 -Subject: [PATCH] Add support for endpoing filter commands - -Implements the commands that allow to link and endpoint to -a project for endpoint filter management. - -Implements: blueprint keystone-endpoint-filter - -Change-Id: Iecf61495664fb8413d35ef69f07ea929d190d002 -Signed-off-by: Kam Nasim ---- - doc/source/cli/command-objects/endpoint.rst | 79 +++++++++++ - openstackclient/identity/v3/endpoint.py | 147 ++++++++++++++++++--- - .../tests/functional/identity/v3/common.py | 1 + - .../tests/functional/identity/v3/test_endpoint.py | 42 ++++++ - openstackclient/tests/unit/identity/v3/fakes.py | 27 ++++ - .../tests/unit/identity/v3/test_endpoint.py | 139 +++++++++++++++++++ - .../keystone-endpoint-filter-e930a7b72276fa2c.yaml | 5 + - setup.cfg | 9 +- - 8 files changed, 429 insertions(+), 20 deletions(-) - create mode 100644 releasenotes/notes/keystone-endpoint-filter-e930a7b72276fa2c.yaml - -diff --git a/doc/source/cli/command-objects/endpoint.rst b/doc/source/cli/command-objects/endpoint.rst -index 02a75be..030947c 100644 ---- a/doc/source/cli/command-objects/endpoint.rst -+++ b/doc/source/cli/command-objects/endpoint.rst -@@ -4,6 +4,34 @@ endpoint - - Identity v2, v3 - -+endpoint add project -+-------------------- -+ -+Associate a project to and endpoint for endpoint filtering -+ -+.. program:: endpoint add project -+.. code:: bash -+ -+ openstack endpoint add project -+ [--project-domain ] -+ -+ -+ -+.. option:: --project-domain -+ -+ Domain the project belongs to (name or ID). -+ This can be used in case collisions between project names exist. -+ -+.. _endpoint_add_project-endpoint: -+.. describe:: -+ -+ Endpoint to associate with specified project (name or ID) -+ -+.. _endpoint_add_project-project: -+.. describe:: -+ -+ Project to associate with specified endpoint (name or ID) -+ - endpoint create - --------------- - -@@ -107,6 +135,8 @@ List endpoints - [--interface ] - [--region ] - [--long] -+ [--endpoint | -+ --project [--project-domain ]] - - .. option:: --service - -@@ -132,6 +162,55 @@ List endpoints - - *Identity version 2 only* - -+.. option:: --endpoint -+ -+ List projects that have access to that endpoint using -+ endpoint filtering -+ -+ *Identity version 3 only* -+ -+.. option:: --project -+ -+ List endpoints available for the project using -+ endpoint filtering -+ -+ *Identity version 3 only* -+ -+.. option:: --project-domain -+ -+ Domain the project belongs to (name or ID). -+ This can be used in case collisions between project names exist. -+ -+ *Identity version 3 only* -+ -+endpoint remove project -+----------------------- -+ -+Dissociate a project from an endpoint. -+ -+.. program:: endpoint remove project -+.. code:: bash -+ -+ openstack endpoint remove project -+ [--project-domain ] -+ -+ -+ -+.. option:: --project-domain -+ -+ Domain the project belongs to (name or ID). -+ This can be used in case collisions between project names exist. -+ -+.. _endpoint_remove_project-endpoint: -+.. describe:: -+ -+ Endpoint to dissociate with specified project (name or ID) -+ -+.. _endpoint_remove_project-project: -+.. describe:: -+ -+ Project to dissociate with specified endpoint (name or ID) -+ - endpoint set - ------------ - -diff --git a/openstackclient/identity/v3/endpoint.py b/openstackclient/identity/v3/endpoint.py -index 3b4dd0d..649a230 100644 ---- a/openstackclient/identity/v3/endpoint.py -+++ b/openstackclient/identity/v3/endpoint.py -@@ -36,6 +36,42 @@ def get_service_name(service): - return '' - - -+class AddProjectToEndpoint(command.Command): -+ _description = _("Associate a project to an endpoint") -+ -+ def get_parser(self, prog_name): -+ parser = super( -+ AddProjectToEndpoint, self).get_parser(prog_name) -+ parser.add_argument( -+ 'endpoint', -+ metavar='', -+ help=_('Endpoint to associate with ' -+ 'specified project (name or ID)'), -+ ) -+ parser.add_argument( -+ 'project', -+ metavar='', -+ help=_('Project to associate with ' -+ 'specified endpoint name or ID)'), -+ ) -+ common.add_project_domain_option_to_parser(parser) -+ return parser -+ -+ def take_action(self, parsed_args): -+ client = self.app.client_manager.identity -+ -+ endpoint = utils.find_resource(client.endpoints, -+ parsed_args.endpoint) -+ -+ project = common.find_project(client, -+ parsed_args.project, -+ parsed_args.project_domain) -+ -+ client.endpoint_filter.add_endpoint_to_project( -+ project=project.id, -+ endpoint=endpoint.id) -+ -+ - class CreateEndpoint(command.ShowOne): - _description = _("Create new endpoint") - -@@ -152,27 +188,68 @@ class ListEndpoint(command.Lister): - metavar='', - help=_('Filter by region ID'), - ) -+ list_group = parser.add_mutually_exclusive_group() -+ list_group.add_argument( -+ '--endpoint', -+ metavar='', -+ help=_('Endpoint to list filters'), -+ ) -+ list_group.add_argument( -+ '--project', -+ metavar='', -+ help=_('Project to list filters (name or ID)'), -+ ) -+ common.add_project_domain_option_to_parser(list_group) - return parser - - def take_action(self, parsed_args): - identity_client = self.app.client_manager.identity -- columns = ('ID', 'Region', 'Service Name', 'Service Type', -- 'Enabled', 'Interface', 'URL') -- kwargs = {} -- if parsed_args.service: -- service = common.find_service(identity_client, parsed_args.service) -- kwargs['service'] = service.id -- if parsed_args.interface: -- kwargs['interface'] = parsed_args.interface -- if parsed_args.region: -- kwargs['region'] = parsed_args.region -- data = identity_client.endpoints.list(**kwargs) -- service_list = identity_client.services.list() -- -- for ep in data: -- service = common.find_service_in_list(service_list, ep.service_id) -- ep.service_name = get_service_name(service) -- ep.service_type = service.type -+ -+ endpoint = None -+ if parsed_args.endpoint: -+ endpoint = utils.find_resource(identity_client.endpoints, -+ parsed_args.endpoint) -+ project = None -+ if parsed_args.project: -+ project = common.find_project(identity_client, -+ parsed_args.project, -+ parsed_args.project_domain) -+ -+ if endpoint: -+ columns = ('ID', 'Name') -+ data = ( -+ identity_client.endpoint_filter -+ .list_projects_for_endpoint(endpoint=endpoint.id) -+ ) -+ else: -+ columns = ('ID', 'Region', 'Service Name', 'Service Type', -+ 'Enabled', 'Interface', 'URL') -+ kwargs = {} -+ if parsed_args.service: -+ service = common.find_service(identity_client, -+ parsed_args.service) -+ kwargs['service'] = service.id -+ if parsed_args.interface: -+ kwargs['interface'] = parsed_args.interface -+ if parsed_args.region: -+ kwargs['region'] = parsed_args.region -+ -+ if project: -+ data = ( -+ identity_client.endpoint_filter -+ .list_endpoints_for_project(project=project.id) -+ ) -+ else: -+ data = identity_client.endpoints.list(**kwargs) -+ -+ service_list = identity_client.services.list() -+ -+ for ep in data: -+ service = common.find_service_in_list(service_list, -+ ep.service_id) -+ ep.service_name = get_service_name(service) -+ ep.service_type = service.type -+ - return (columns, - (utils.get_item_properties( - s, columns, -@@ -180,6 +257,42 @@ class ListEndpoint(command.Lister): - ) for s in data)) - - -+class RemoveProjectFromEndpoint(command.Command): -+ _description = _("Dissociate a project from an endpoint") -+ -+ def get_parser(self, prog_name): -+ parser = super( -+ RemoveProjectFromEndpoint, self).get_parser(prog_name) -+ parser.add_argument( -+ 'endpoint', -+ metavar='', -+ help=_('Endpoint to dissociate from ' -+ 'specified project (name or ID)'), -+ ) -+ parser.add_argument( -+ 'project', -+ metavar='', -+ help=_('Project to dissociate from ' -+ 'specified endpoint name or ID)'), -+ ) -+ common.add_project_domain_option_to_parser(parser) -+ return parser -+ -+ def take_action(self, parsed_args): -+ client = self.app.client_manager.identity -+ -+ endpoint = utils.find_resource(client.endpoints, -+ parsed_args.endpoint) -+ -+ project = common.find_project(client, -+ parsed_args.project, -+ parsed_args.project_domain) -+ -+ client.endpoint_filter.delete_endpoint_from_project( -+ project=project.id, -+ endpoint=endpoint.id) -+ -+ - class SetEndpoint(command.Command): - _description = _("Set endpoint properties") - -diff --git a/openstackclient/tests/functional/identity/v3/common.py b/openstackclient/tests/functional/identity/v3/common.py -index 6d7896d..33cb5d8 100644 ---- a/openstackclient/tests/functional/identity/v3/common.py -+++ b/openstackclient/tests/functional/identity/v3/common.py -@@ -42,6 +42,7 @@ class IdentityTests(base.TestCase): - REGION_LIST_HEADERS = ['Region', 'Parent Region', 'Description'] - ENDPOINT_LIST_HEADERS = ['ID', 'Region', 'Service Name', 'Service Type', - 'Enabled', 'Interface', 'URL'] -+ ENDPOINT_LIST_PROJECT_HEADERS = ['ID', 'Name'] - - IDENTITY_PROVIDER_FIELDS = ['description', 'enabled', 'id', 'remote_ids', - 'domain_id'] -diff --git a/openstackclient/tests/functional/identity/v3/test_endpoint.py b/openstackclient/tests/functional/identity/v3/test_endpoint.py -index 22dc1b6..41f0b4c 100644 ---- a/openstackclient/tests/functional/identity/v3/test_endpoint.py -+++ b/openstackclient/tests/functional/identity/v3/test_endpoint.py -@@ -42,6 +42,29 @@ class EndpointTests(common.IdentityTests): - items = self.parse_listing(raw_output) - self.assert_table_structure(items, self.ENDPOINT_LIST_HEADERS) - -+ def test_endpoint_list_filter(self): -+ endpoint_id = self._create_dummy_endpoint(add_clean_up=False) -+ project_id = self._create_dummy_project(add_clean_up=False) -+ raw_output = self.openstack( -+ 'endpoint add project ' -+ '%(endpoint_id)s ' -+ '%(project_id)s' % { -+ 'project_id': project_id, -+ 'endpoint_id': endpoint_id}) -+ self.assertEqual(0, len(raw_output)) -+ raw_output = self.openstack( -+ 'endpoint list --endpoint %s' % endpoint_id) -+ self.assertIn(project_id, raw_output) -+ items = self.parse_listing(raw_output) -+ self.assert_table_structure(items, -+ self.ENDPOINT_LIST_PROJECT_HEADERS) -+ -+ raw_output = self.openstack( -+ 'endpoint list --project %s' % project_id) -+ self.assertIn(endpoint_id, raw_output) -+ items = self.parse_listing(raw_output) -+ self.assert_table_structure(items, self.ENDPOINT_LIST_HEADERS) -+ - def test_endpoint_set(self): - endpoint_id = self._create_dummy_endpoint() - new_endpoint_url = data_utils.rand_url() -@@ -65,3 +88,22 @@ class EndpointTests(common.IdentityTests): - raw_output = self.openstack('endpoint show %s' % endpoint_id) - items = self.parse_show(raw_output) - self.assert_show_fields(items, self.ENDPOINT_FIELDS) -+ -+ def test_endpoint_add_remove_project(self): -+ endpoint_id = self._create_dummy_endpoint(add_clean_up=False) -+ project_id = self._create_dummy_project(add_clean_up=False) -+ raw_output = self.openstack( -+ 'endpoint add project ' -+ '%(endpoint_id)s ' -+ '%(project_id)s' % { -+ 'project_id': project_id, -+ 'endpoint_id': endpoint_id}) -+ self.assertEqual(0, len(raw_output)) -+ -+ raw_output = self.openstack( -+ 'endpoint remove project ' -+ '%(endpoint_id)s ' -+ '%(project_id)s' % { -+ 'project_id': project_id, -+ 'endpoint_id': endpoint_id}) -+ self.assertEqual(0, len(raw_output)) -diff --git a/openstackclient/tests/unit/identity/v3/fakes.py b/openstackclient/tests/unit/identity/v3/fakes.py -index c7d2988..549a1aa 100644 ---- a/openstackclient/tests/unit/identity/v3/fakes.py -+++ b/openstackclient/tests/unit/identity/v3/fakes.py -@@ -491,6 +491,8 @@ class FakeIdentityv3Client(object): - self.credentials.resource_class = fakes.FakeResource(None, {}) - self.endpoints = mock.Mock() - self.endpoints.resource_class = fakes.FakeResource(None, {}) -+ self.endpoint_filter = mock.Mock() -+ self.endpoint_filter.resource_class = fakes.FakeResource(None, {}) - self.groups = mock.Mock() - self.groups.resource_class = fakes.FakeResource(None, {}) - self.oauth1 = mock.Mock() -@@ -909,6 +911,31 @@ class FakeEndpoint(object): - loaded=True) - return endpoint - -+ @staticmethod -+ def create_one_endpoint_filter(attrs=None): -+ """Create a fake endpoint project relationship. -+ -+ :param Dictionary attrs: -+ A dictionary with all attributes of endpoint filter -+ :return: -+ A FakeResource object with project, endpoint and so on -+ """ -+ attrs = attrs or {} -+ -+ # Set default attribute -+ endpoint_filter_info = { -+ 'project': 'project-id-' + uuid.uuid4().hex, -+ 'endpoint': 'endpoint-id-' + uuid.uuid4().hex, -+ } -+ -+ # Overwrite default attributes if there are some attributes set -+ endpoint_filter_info.update(attrs) -+ -+ endpoint_filter = fakes.FakeModel( -+ copy.deepcopy(endpoint_filter_info)) -+ -+ return endpoint_filter -+ - - class FakeService(object): - """Fake one or more service.""" -diff --git a/openstackclient/tests/unit/identity/v3/test_endpoint.py b/openstackclient/tests/unit/identity/v3/test_endpoint.py -index fad53fc..bfe930d 100644 ---- a/openstackclient/tests/unit/identity/v3/test_endpoint.py -+++ b/openstackclient/tests/unit/identity/v3/test_endpoint.py -@@ -22,11 +22,23 @@ class TestEndpoint(identity_fakes.TestIdentityv3): - # Get a shortcut to the EndpointManager Mock - self.endpoints_mock = self.app.client_manager.identity.endpoints - self.endpoints_mock.reset_mock() -+ self.ep_filter_mock = ( -+ self.app.client_manager.identity.endpoint_filter -+ ) -+ self.ep_filter_mock.reset_mock() - - # Get a shortcut to the ServiceManager Mock - self.services_mock = self.app.client_manager.identity.services - self.services_mock.reset_mock() - -+ # Get a shortcut to the DomainManager Mock -+ self.domains_mock = self.app.client_manager.identity.domains -+ self.domains_mock.reset_mock() -+ -+ # Get a shortcut to the ProjectManager Mock -+ self.projects_mock = self.app.client_manager.identity.projects -+ self.projects_mock.reset_mock() -+ - - class TestEndpointCreate(TestEndpoint): - -@@ -750,3 +762,130 @@ class TestEndpointShowServiceWithoutName(TestEndpointShow): - - # Get the command object to test - self.cmd = endpoint.ShowEndpoint(self.app, None) -+ -+ -+class TestAddProjectToEndpoint(TestEndpoint): -+ -+ project = identity_fakes.FakeProject.create_one_project() -+ domain = identity_fakes.FakeDomain.create_one_domain() -+ service = identity_fakes.FakeService.create_one_service() -+ endpoint = identity_fakes.FakeEndpoint.create_one_endpoint( -+ attrs={'service_id': service.id}) -+ -+ new_ep_filter = identity_fakes.FakeEndpoint.create_one_endpoint_filter( -+ attrs={'endpoint': endpoint.id, -+ 'project': project.id} -+ ) -+ -+ def setUp(self): -+ super(TestAddProjectToEndpoint, self).setUp() -+ -+ # This is the return value for utils.find_resource() -+ self.endpoints_mock.get.return_value = self.endpoint -+ -+ # Update the image_id in the MEMBER dict -+ self.ep_filter_mock.create.return_value = self.new_ep_filter -+ self.projects_mock.get.return_value = self.project -+ self.domains_mock.get.return_value = self.domain -+ # Get the command object to test -+ self.cmd = endpoint.AddProjectToEndpoint(self.app, None) -+ -+ def test_add_project_to_endpoint_no_option(self): -+ arglist = [ -+ self.endpoint.id, -+ self.project.id, -+ ] -+ verifylist = [ -+ ('endpoint', self.endpoint.id), -+ ('project', self.project.id), -+ ] -+ parsed_args = self.check_parser(self.cmd, arglist, verifylist) -+ -+ result = self.cmd.take_action(parsed_args) -+ self.ep_filter_mock.add_endpoint_to_project.assert_called_with( -+ project=self.project.id, -+ endpoint=self.endpoint.id -+ ) -+ self.assertIsNone(result) -+ -+ def test_add_project_to_endpoint_with_option(self): -+ arglist = [ -+ self.endpoint.id, -+ self.project.id, -+ '--project-domain', self.domain.id, -+ ] -+ verifylist = [ -+ ('endpoint', self.endpoint.id), -+ ('project', self.project.id), -+ ('project_domain', self.domain.id), -+ ] -+ parsed_args = self.check_parser(self.cmd, arglist, verifylist) -+ -+ result = self.cmd.take_action(parsed_args) -+ self.ep_filter_mock.add_endpoint_to_project.assert_called_with( -+ project=self.project.id, -+ endpoint=self.endpoint.id -+ ) -+ self.assertIsNone(result) -+ -+ -+class TestRemoveProjectEndpoint(TestEndpoint): -+ -+ project = identity_fakes.FakeProject.create_one_project() -+ domain = identity_fakes.FakeDomain.create_one_domain() -+ service = identity_fakes.FakeService.create_one_service() -+ endpoint = identity_fakes.FakeEndpoint.create_one_endpoint( -+ attrs={'service_id': service.id}) -+ -+ def setUp(self): -+ super(TestRemoveProjectEndpoint, self).setUp() -+ -+ # This is the return value for utils.find_resource() -+ self.endpoints_mock.get.return_value = self.endpoint -+ -+ self.projects_mock.get.return_value = self.project -+ self.domains_mock.get.return_value = self.domain -+ self.ep_filter_mock.delete.return_value = None -+ -+ # Get the command object to test -+ self.cmd = endpoint.RemoveProjectFromEndpoint(self.app, None) -+ -+ def test_remove_project_endpoint_no_options(self): -+ arglist = [ -+ self.endpoint.id, -+ self.project.id, -+ ] -+ verifylist = [ -+ ('endpoint', self.endpoint.id), -+ ('project', self.project.id), -+ ] -+ parsed_args = self.check_parser(self.cmd, arglist, verifylist) -+ -+ result = self.cmd.take_action(parsed_args) -+ -+ self.ep_filter_mock.delete_endpoint_from_project.assert_called_with( -+ project=self.project.id, -+ endpoint=self.endpoint.id, -+ ) -+ self.assertIsNone(result) -+ -+ def test_remove_project_endpoint_with_options(self): -+ arglist = [ -+ self.endpoint.id, -+ self.project.id, -+ '--project-domain', self.domain.id, -+ ] -+ verifylist = [ -+ ('endpoint', self.endpoint.id), -+ ('project', self.project.id), -+ ('project_domain', self.domain.id), -+ ] -+ parsed_args = self.check_parser(self.cmd, arglist, verifylist) -+ -+ result = self.cmd.take_action(parsed_args) -+ -+ self.ep_filter_mock.delete_endpoint_from_project.assert_called_with( -+ project=self.project.id, -+ endpoint=self.endpoint.id, -+ ) -+ self.assertIsNone(result) -diff --git a/releasenotes/notes/keystone-endpoint-filter-e930a7b72276fa2c.yaml b/releasenotes/notes/keystone-endpoint-filter-e930a7b72276fa2c.yaml -new file mode 100644 -index 0000000..5a633ee ---- /dev/null -+++ b/releasenotes/notes/keystone-endpoint-filter-e930a7b72276fa2c.yaml -@@ -0,0 +1,5 @@ -+--- -+features: -+ - | -+ Add ``endpoint add project``, ``endpoint remove project`` and ``endpoint -+ list`` commands to manage endpoint filters in identity v3. -diff --git a/setup.cfg b/setup.cfg -index 1b8e006..d60657f 100644 ---- a/setup.cfg -+++ b/setup.cfg -@@ -194,12 +194,15 @@ openstack.identity.v3 = - ec2_credentials_delete = openstackclient.identity.v3.ec2creds:DeleteEC2Creds - ec2_credentials_list = openstackclient.identity.v3.ec2creds:ListEC2Creds - ec2_credentials_show = openstackclient.identity.v3.ec2creds:ShowEC2Creds -- endpoint_create = openstackclient.identity.v3.endpoint:CreateEndpoint -+ -+ endpoint_add_project = openstackclient.identity.v3.endpoint:AddProjectToEndpoint -+ endpoint_create = openstackclient.identity.v3.endpoint:CreateEndpoint - endpoint_delete = openstackclient.identity.v3.endpoint:DeleteEndpoint -+ endpoint_list = openstackclient.identity.v3.endpoint:ListEndpoint -+ endpoint_remove_project = openstackclient.identity.v3.endpoint:RemoveProjectFromEndpoint - endpoint_set = openstackclient.identity.v3.endpoint:SetEndpoint - endpoint_show = openstackclient.identity.v3.endpoint:ShowEndpoint -- endpoint_list = openstackclient.identity.v3.endpoint:ListEndpoint -- group_add_user = openstackclient.identity.v3.group:AddUserToGroup -+ group_add_user = openstackclient.identity.v3.group:AddUserToGroup - group_contains_user = openstackclient.identity.v3.group:CheckUserInGroup - group_create = openstackclient.identity.v3.group:CreateGroup - group_delete = openstackclient.identity.v3.group:DeleteGroup --- -1.8.3.1 - diff --git a/openstack/python-openstackclient/centos/patches/0002-US101470-Openstackclient-implementation-of-novaclien.patch b/openstack/python-openstackclient/centos/patches/0002-US101470-Openstackclient-implementation-of-novaclien.patch deleted file mode 100644 index cc9a187d..00000000 --- a/openstack/python-openstackclient/centos/patches/0002-US101470-Openstackclient-implementation-of-novaclien.patch +++ /dev/null @@ -1,273 +0,0 @@ -From 8fe2869469d3b853e24140e4ffb487d672232b1b Mon Sep 17 00:00:00 2001 -From: rpm-build -Date: Fri, 5 Jan 2018 15:01:24 -0500 -Subject: [PATCH] US101470 OSC equivalence of nova cli with WRS extension - -CI part2 ---- - openstackclient/compute/v2/server.py | 37 +++++++++++ - openstackclient/compute/v2/server_group.py | 99 ++++++++++++++++++++++++++++-- - setup.cfg | 2 + - 3 files changed, 132 insertions(+), 6 deletions(-) - -diff --git a/openstackclient/compute/v2/server.py b/openstackclient/compute/v2/server.py -index 151c678..c7ffab9 100644 ---- a/openstackclient/compute/v2/server.py -+++ b/openstackclient/compute/v2/server.py -@@ -12,6 +12,13 @@ - # License for the specific language governing permissions and limitations - # under the License. - # -+# Copyright (c) 2013-2018 Wind River Systems, Inc. -+# SPDX-License-Identifier: Apache-2.0 -+# -+# -+# -+# -+ - - """Compute v2 Server action implementations""" - -@@ -1714,6 +1721,36 @@ class ResumeServer(command.Command): - ).resume() - - -+# WRS:extension -+class ScaleServer(command.Command): -+ _description = _("Scale server properties") -+ -+ def get_parser(self, prog_name): -+ parser = super(ScaleServer, self).get_parser(prog_name) -+ parser.add_argument( -+ 'server', -+ metavar='', -+ help=_('Name or ID of server'), -+ ) -+ parser.add_argument( -+ 'resource', -+ metavar='', -+ help=_('Resource to scale. Currently only "cpu"'), -+ ) -+ parser.add_argument( -+ 'direction', -+ metavar='', -+ help=_('Direction to scale ("up" or "down")'), -+ ) -+ return parser -+ -+ def take_action(self, parsed_args): -+ compute_client = self.app.client_manager.compute -+ compute_client.servers.scale(parsed_args.server, -+ parsed_args.resource, -+ parsed_args.direction) -+ -+ - class SetServer(command.Command): - _description = _("Set server properties") - -diff --git a/openstackclient/compute/v2/server_group.py b/openstackclient/compute/v2/server_group.py -index c6e2161..551ed8e 100644 ---- a/openstackclient/compute/v2/server_group.py -+++ b/openstackclient/compute/v2/server_group.py -@@ -12,6 +12,12 @@ - # License for the specific language governing permissions and limitations - # under the License. - # -+# Copyright (c) 2013-2018 Wind River Systems, Inc. -+# SPDX-License-Identifier: Apache-2.0 -+# -+# -+# -+# - - """Compute v2 Server Group action implementations""" - -@@ -22,6 +28,7 @@ from osc_lib import exceptions - from osc_lib import utils - - from openstackclient.i18n import _ -+from novaclient import api_versions - - - LOG = logging.getLogger(__name__) -@@ -35,12 +42,40 @@ _formatters = { - - def _get_columns(info): - columns = list(info.keys()) -- if 'metadata' in columns: -- # NOTE(RuiChen): The metadata of server group is always empty since API -- # compatible, so hide it in order to avoid confusion. -- columns.remove('metadata') - return tuple(sorted(columns)) - -+#WRS:extension -+def _extract_metadata(args): -+ metadata = {} -+ for server_group in args.metadata: -+ for metadatum in server_group: -+ if metadatum.find('=') > -1: -+ (key, value) = metadatum.split('=', 1) -+ else: -+ key = metadatum -+ value = None -+ metadata[key] = value -+ return metadata -+ -+# WRS:extension - type checking for key-value pair -+# returns text instead of tuple like above -+def _key_value_type(text): -+ try: -+ (k, v) = text.split('=', 1) -+ return text -+ except ValueError: -+ msg = "%r is not in the format of key=value" % text -+ raise argparse.ArgumentTypeError(msg) -+ -+ -+# WRS:extension - type checking for CSV key-value pairs -+def _csv_key_value_type(text): -+ try: -+ return map(_key_value_type, text.split(',')) -+ except Exception as e: -+ raise exceptions.CommandError( -+ "Invalid csv key-value argument '%s'. %s" % (text, unicode(e))) -+ - - class CreateServerGroup(command.ShowOne): - _description = _("Create a new server group.") -@@ -52,6 +87,15 @@ class CreateServerGroup(command.ShowOne): - metavar='', - help=_("New server group name") - ) -+ # WRS:extension -+ parser.add_argument( -+ '--metadata', -+ metavar='', -+ action='append', -+ default=[], -+ type=_csv_key_value_type, -+ help=_("Metadata for this server group") -+ ) - parser.add_argument( - '--policy', - metavar='', -@@ -67,17 +111,21 @@ class CreateServerGroup(command.ShowOne): - def take_action(self, parsed_args): - compute_client = self.app.client_manager.compute - info = {} -+ -+ #WRS:extension -+ meta = _extract_metadata(parsed_args) -+ compute_client.api_version = api_versions.APIVersion("2.53") - server_group = compute_client.server_groups.create( - name=parsed_args.name, -+ metadata=meta, - policies=[parsed_args.policy]) -- info.update(server_group._info) - -+ info.update(server_group._info) - columns = _get_columns(info) - data = utils.get_dict_properties(info, columns, - formatters=_formatters) - return columns, data - -- - class DeleteServerGroup(command.Command): - _description = _("Delete existing server group(s).") - -@@ -134,8 +182,13 @@ class ListServerGroup(command.Lister): - - def take_action(self, parsed_args): - compute_client = self.app.client_manager.compute -+ -+ #WRS:extension -+ compute_client.api_version = api_versions.APIVersion("2.53") -+ - data = compute_client.server_groups.list(parsed_args.all_projects) - -+ #WRS:extension list project_id, user_id fields and metadata fields - if parsed_args.long: - column_headers = columns = ( - 'ID', -@@ -144,12 +197,14 @@ class ListServerGroup(command.Lister): - 'Members', - 'Project Id', - 'User Id', -+ 'Metadata', - ) - else: - column_headers = columns = ( - 'ID', - 'Name', - 'Policies', -+ 'Metadata', - ) - - return (column_headers, -@@ -176,11 +231,43 @@ class ShowServerGroup(command.ShowOne): - - def take_action(self, parsed_args): - compute_client = self.app.client_manager.compute -+ #WRS:extension -+ compute_client.api_version = api_versions.APIVersion("2.53") -+ - group = utils.find_resource(compute_client.server_groups, - parsed_args.server_group) -+ - info = {} - info.update(group._info) - columns = _get_columns(info) - data = utils.get_dict_properties(info, columns, - formatters=_formatters) - return columns, data -+ -+#WRS:extension -+class SetServerGroupMetadata(command.Command): -+ _description = _("Set metadata of a server group") -+ -+ def get_parser(self, prog_name): -+ parser = super(SetServerGroupMetadata, self).get_parser(prog_name) -+ parser.add_argument( -+ 'id', -+ metavar='', -+ help=_("Unique ID of the server group") -+ ) -+ parser.add_argument( -+ 'metadata', -+ metavar='', -+ action='append', -+ default=[], -+ type=_csv_key_value_type, -+ help=_("Metadata to set/unset") -+ ) -+ return parser -+ -+ def take_action(self, parsed_args): -+ compute_client = self.app.client_manager.compute -+ metadata = _extract_metadata(parsed_args) -+ compute_client.api_version = api_versions.APIVersion("2.53") -+ compute_client.server_groups.set_metadata(parsed_args.id, metadata) -+ -diff --git a/setup.cfg b/setup.cfg -index f162417..627ff87 100644 ---- a/setup.cfg -+++ b/setup.cfg -@@ -110,6 +110,7 @@ openstack.compute.v2 = - server_resize = openstackclient.compute.v2.server:ResizeServer - server_restore = openstackclient.compute.v2.server:RestoreServer - server_resume = openstackclient.compute.v2.server:ResumeServer -+ server_scale = openstackclient.compute.v2.server:ScaleServer - server_set = openstackclient.compute.v2.server:SetServer - server_shelve = openstackclient.compute.v2.server:ShelveServer - server_show = openstackclient.compute.v2.server:ShowServer -@@ -129,6 +130,7 @@ openstack.compute.v2 = - server_group_create = openstackclient.compute.v2.server_group:CreateServerGroup - server_group_delete = openstackclient.compute.v2.server_group:DeleteServerGroup - server_group_list = openstackclient.compute.v2.server_group:ListServerGroup -+ server_group_set_metadata = openstackclient.compute.v2.server_group:SetServerGroupMetadata - server_group_show = openstackclient.compute.v2.server_group:ShowServerGroup - server_image_create = openstackclient.compute.v2.server_image:CreateServerImage - usage_list = openstackclient.compute.v2.usage:ListUsage --- -1.8.3.1 - diff --git a/openstack/python-openstackclient/centos/patches/0002-US106901-Openstack-CLI-Adoption.patch b/openstack/python-openstackclient/centos/patches/0002-US106901-Openstack-CLI-Adoption.patch deleted file mode 100644 index db453efa..00000000 --- a/openstack/python-openstackclient/centos/patches/0002-US106901-Openstack-CLI-Adoption.patch +++ /dev/null @@ -1,330 +0,0 @@ -From c4f2db9901b54217e1737987a19a8b48209f40ab Mon Sep 17 00:00:00 2001 -From: rpm-build -Date: Mon, 5 Feb 2018 14:06:32 -0500 -Subject: [PATCH 1/1] US106901 Openstack CLI Adoption: Cinder/Glance/Ceilometer - - CI partII: OSC equivalence of cinder cli with WRS extension ---- - openstackclient/volume/v1/volume.py | 58 ++++++++++++++++++++++++++++ - openstackclient/volume/v1/volume_snapshot.py | 26 +++++++++++++ - openstackclient/volume/v2/volume.py | 57 +++++++++++++++++++++++++++ - openstackclient/volume/v2/volume_snapshot.py | 27 +++++++++++++ - setup.cfg | 11 +++++- - 5 files changed, 178 insertions(+), 1 deletion(-) - -diff --git a/openstackclient/volume/v1/volume.py b/openstackclient/volume/v1/volume.py -index b29429e..85caf3e 100644 ---- a/openstackclient/volume/v1/volume.py -+++ b/openstackclient/volume/v1/volume.py -@@ -12,6 +12,13 @@ - # License for the specific language governing permissions and limitations - # under the License. - # -+# Copyright (c) 2013-2018 Wind River Systems, Inc. -+# SPDX-License-Identifier: Apache-2.0 -+# -+# -+# -+# -+ - - """Volume v1 Volume action implementations""" - -@@ -25,6 +32,7 @@ from osc_lib import utils - import six - - from openstackclient.i18n import _ -+from cinderclient import utils as cinder_utils - - - LOG = logging.getLogger(__name__) -@@ -624,3 +632,53 @@ class UnsetVolume(command.Command): - volume.id, - parsed_args.property, - ) -+ -+ -+# WRS extension -+class ExportVolume(command.Command): -+ _description = _("Export volume to a file.") -+ -+ def get_parser(self, prog_name): -+ parser = super(ExportVolume, self).get_parser(prog_name) -+ parser.add_argument( -+ 'volume', -+ metavar='', -+ help=_('Name or ID of the volume to export'), -+ ) -+ return parser -+ -+ def take_action(self, parsed_args): -+ volume_client = self.app.client_manager.volume -+ volume = utils.find_resource( -+ volume_client.volumes, parsed_args.volume) -+ volume_client.volumes.export(volume) -+ -+ -+# WRS extension -+class ImportVolume(command.Command): -+ _description = _("Import a volume from a file.") -+ -+ def get_parser(self, prog_name): -+ parser = super(ImportVolume, self).get_parser(prog_name) -+ parser.add_argument( -+ 'file_name', -+ metavar='', -+ help=_('Name of the file to import'), -+ ) -+ return parser -+ -+ def take_action(self, parsed_args): -+ volume_client = self.app.client_manager.volume -+ -+ # Parse the volume ID from the filename which is in this format: -+ # volume--.tgz -+ if(parsed_args.file_name.find("volume-") != 0 or -+ parsed_args.file_name.rfind(".tgz") == -1 or -+ len(parsed_args.file_name) < 28): -+ raise exceptions.CommandError( -+ "Invalid filename - volume files must have the following format: " -+ "volume--.tgz") -+ -+ volume_id = parsed_args.file_name[7:-20] -+ volume = cinder_utils.find_volume(volume_client, volume_id) -+ volume_client.volumes.import_volume(volume, parsed_args.file_name) -diff --git a/openstackclient/volume/v1/volume_snapshot.py b/openstackclient/volume/v1/volume_snapshot.py -index 3e83da5..a4d44a8 100644 ---- a/openstackclient/volume/v1/volume_snapshot.py -+++ b/openstackclient/volume/v1/volume_snapshot.py -@@ -12,6 +12,12 @@ - # License for the specific language governing permissions and limitations - # under the License. - # -+# Copyright (c) 2013-2018 Wind River Systems, Inc. -+# SPDX-License-Identifier: Apache-2.0 -+# -+# -+# -+# - - """Volume v1 Snapshot action implementations""" - -@@ -25,6 +31,7 @@ from osc_lib import utils - import six - - from openstackclient.i18n import _ -+from cinderclient import utils as cinder_utils - - - LOG = logging.getLogger(__name__) -@@ -352,3 +359,22 @@ class UnsetVolumeSnapshot(command.Command): - snapshot.id, - parsed_args.property, - ) -+ -+# WRS extension -+class ExportVolumeSnapshot(command.Command): -+ _description = _("Export a snapshot to a file.") -+ -+ def get_parser(self, prog_name): -+ parser = super(ExportVolumeSnapshot, self).get_parser(prog_name) -+ parser.add_argument( -+ 'snapshot', -+ metavar='', -+ help=_('Name or ID of the snapshot to export'), -+ ) -+ return parser -+ -+ def take_action(self, parsed_args): -+ volume_client = self.app.client_manager.volume -+ snapshot = cinder_utils.find_resource( -+ volume_client.volume_snapshots, parsed_args.snapshot) -+ volume_client.volume_snapshots.export(snapshot) -diff --git a/openstackclient/volume/v2/volume.py b/openstackclient/volume/v2/volume.py -index 61f846b..c2ea7a4 100644 ---- a/openstackclient/volume/v2/volume.py -+++ b/openstackclient/volume/v2/volume.py -@@ -11,6 +11,12 @@ - # License for the specific language governing permissions and limitations - # under the License. - # -+# Copyright (c) 2013-2018 Wind River Systems, Inc. -+# SPDX-License-Identifier: Apache-2.0 -+# -+# -+# -+# - - """Volume V2 Volume action implementations""" - -@@ -25,6 +31,7 @@ import six - - from openstackclient.i18n import _ - from openstackclient.identity import common as identity_common -+from cinderclient import utils as cinder_utils - - - LOG = logging.getLogger(__name__) -@@ -784,3 +791,53 @@ class UnsetVolume(command.Command): - if result > 0: - raise exceptions.CommandError(_("One or more of the " - "unset operations failed")) -+ -+ -+# WRS extension -+class ExportVolume(command.Command): -+ _description = _("Export volume to a file.") -+ -+ def get_parser(self, prog_name): -+ parser = super(ExportVolume, self).get_parser(prog_name) -+ parser.add_argument( -+ 'volume', -+ metavar='', -+ help=_('Name or ID of the volume to export'), -+ ) -+ return parser -+ -+ def take_action(self, parsed_args): -+ volume_client = self.app.client_manager.volume -+ volume = cinder_utils.find_resource( -+ volume_client.volumes, parsed_args.volume) -+ volume_client.volumes.export(volume) -+ -+ -+# WRS extension -+class ImportVolume(command.Command): -+ _description = _("Import a volume from a file.") -+ -+ def get_parser(self, prog_name): -+ parser = super(ImportVolume, self).get_parser(prog_name) -+ parser.add_argument( -+ 'file_name', -+ metavar='', -+ help=_('Name of the file to import'), -+ ) -+ return parser -+ -+ def take_action(self, parsed_args): -+ volume_client = self.app.client_manager.volume -+ -+ # Parse the volume ID from the filename which is in this format: -+ # volume--.tgz -+ if(parsed_args.file_name.find("volume-") != 0 or -+ parsed_args.file_name.rfind(".tgz") == -1 or -+ len(parsed_args.file_name) < 28): -+ raise exceptions.CommandError( -+ "Invalid filename - volume files must have the following format: " -+ "volume--.tgz") -+ -+ volume_id = parsed_args.file_name[7:-20] -+ volume = cinder_utils.find_volume(volume_client, volume_id) -+ volume_client.volumes.import_volume(volume, parsed_args.file_name) -diff --git a/openstackclient/volume/v2/volume_snapshot.py b/openstackclient/volume/v2/volume_snapshot.py -index fe96941..704ef75 100644 ---- a/openstackclient/volume/v2/volume_snapshot.py -+++ b/openstackclient/volume/v2/volume_snapshot.py -@@ -11,6 +11,12 @@ - # License for the specific language governing permissions and limitations - # under the License. - # -+# Copyright (c) 2013-2018 Wind River Systems, Inc. -+# SPDX-License-Identifier: Apache-2.0 -+# -+# -+# -+# - - """Volume v2 snapshot action implementations""" - -@@ -25,6 +31,7 @@ import six - - from openstackclient.i18n import _ - from openstackclient.identity import common as identity_common -+from cinderclient import utils as cinder_utils - - - LOG = logging.getLogger(__name__) -@@ -437,3 +444,23 @@ class UnsetVolumeSnapshot(command.Command): - snapshot.id, - parsed_args.property, - ) -+ -+ -+# WRS extension -+class ExportVolumeSnapshot(command.Command): -+ _description = _("Export a snapshot to a file.") -+ -+ def get_parser(self, prog_name): -+ parser = super(ExportVolumeSnapshot, self).get_parser(prog_name) -+ parser.add_argument( -+ 'snapshot', -+ metavar='', -+ help=_('Name or ID of the snapshot to export'), -+ ) -+ return parser -+ -+ def take_action(self, parsed_args): -+ volume_client = self.app.client_manager.volume -+ snapshot = cinder_utils.find_resource( -+ volume_client.volume_snapshots, parsed_args.snapshot) -+ volume_client.volume_snapshots.export(snapshot) -diff --git a/setup.cfg b/setup.cfg -index 627ff87..11f7261 100644 ---- a/setup.cfg -+++ b/setup.cfg -@@ -463,6 +463,8 @@ openstack.volume.v1 = - snapshot_unset = openstackclient.volume.v1.snapshot:UnsetSnapshot - volume_create = openstackclient.volume.v1.volume:CreateVolume - volume_delete = openstackclient.volume.v1.volume:DeleteVolume -+ volume_export = openstackclient.volume.v1.volume:ExportVolume -+ volume_import = openstackclient.volume.v1.volume:ImportVolume - volume_list = openstackclient.volume.v1.volume:ListVolume - volume_migrate = openstackclient.volume.v1.volume:MigrateVolume - volume_set = openstackclient.volume.v1.volume:SetVolume -@@ -475,6 +477,7 @@ openstack.volume.v1 = - volume_backup_show = openstackclient.volume.v1.backup:ShowVolumeBackup - volume_snapshot_create = openstackclient.volume.v1.volume_snapshot:CreateVolumeSnapshot - volume_snapshot_delete = openstackclient.volume.v1.volume_snapshot:DeleteVolumeSnapshot -+ volume_snapshot_export = openstackclient.volume.v1.volume_snapshot:ExportVolumeSnapshot - volume_snapshot_list = openstackclient.volume.v1.volume_snapshot:ListVolumeSnapshot - volume_snapshot_set = openstackclient.volume.v1.volume_snapshot:SetVolumeSnapshot - volume_snapshot_show = openstackclient.volume.v1.volume_snapshot:ShowVolumeSnapshot -@@ -524,7 +527,9 @@ openstack.volume.v2 = - snapshot_show = openstackclient.volume.v2.snapshot:ShowSnapshot - snapshot_unset = openstackclient.volume.v2.snapshot:UnsetSnapshot - volume_create = openstackclient.volume.v2.volume:CreateVolume -- volume_delete = openstackclient.volume.v2.volume:DeleteVolume -+ volume_delete = openstackclient.volume.v2.volume:DeleteVolume -+ volume_export = openstackclient.volume.v2.volume:ExportVolume -+ volume_import = openstackclient.volume.v2.volume:ImportVolume - volume_list = openstackclient.volume.v2.volume:ListVolume - volume_migrate = openstackclient.volume.v2.volume:MigrateVolume - volume_set = openstackclient.volume.v2.volume:SetVolume -@@ -540,6 +545,7 @@ openstack.volume.v2 = - volume_host_set = openstackclient.volume.v2.volume_host:SetVolumeHost - volume_snapshot_create = openstackclient.volume.v2.volume_snapshot:CreateVolumeSnapshot - volume_snapshot_delete = openstackclient.volume.v2.volume_snapshot:DeleteVolumeSnapshot -+ volume_snapshot_export = openstackclient.volume.v2.volume_snapshot:ExportVolumeSnapshot - volume_snapshot_list = openstackclient.volume.v2.volume_snapshot:ListVolumeSnapshot - volume_snapshot_set = openstackclient.volume.v2.volume_snapshot:SetVolumeSnapshot - volume_snapshot_show = openstackclient.volume.v2.volume_snapshot:ShowVolumeSnapshot -@@ -579,6 +585,8 @@ openstack.volume.v3 = - consistency_group_snapshot_show = openstackclient.volume.v2.consistency_group_snapshot:ShowConsistencyGroupSnapshot - volume_create = openstackclient.volume.v2.volume:CreateVolume - volume_delete = openstackclient.volume.v2.volume:DeleteVolume -+ volume_export = openstackclient.volume.v2.volume:ExportVolume -+ volume_import = openstackclient.volume.v2.volume:ImportVolume - volume_list = openstackclient.volume.v2.volume:ListVolume - volume_migrate = openstackclient.volume.v2.volume:MigrateVolume - volume_set = openstackclient.volume.v2.volume:SetVolume -@@ -593,6 +601,7 @@ openstack.volume.v3 = - volume_host_set = openstackclient.volume.v2.volume_host:SetVolumeHost - volume_snapshot_create = openstackclient.volume.v2.volume_snapshot:CreateVolumeSnapshot - volume_snapshot_delete = openstackclient.volume.v2.volume_snapshot:DeleteVolumeSnapshot -+ volume_snapshot_export = openstackclient.volume.v2.volume_snapshot:ExportVolumeSnapshot - volume_snapshot_list = openstackclient.volume.v2.volume_snapshot:ListVolumeSnapshot - volume_snapshot_set = openstackclient.volume.v2.volume_snapshot:SetVolumeSnapshot - volume_snapshot_show = openstackclient.volume.v2.volume_snapshot:ShowVolumeSnapshot --- -1.8.3.1 - diff --git a/openstack/python-openstackclient/centos/patches/0003-Add-support-for-endpoint-group-commands.patch b/openstack/python-openstackclient/centos/patches/0003-Add-support-for-endpoint-group-commands.patch deleted file mode 100644 index 29094ffa..00000000 --- a/openstack/python-openstackclient/centos/patches/0003-Add-support-for-endpoint-group-commands.patch +++ /dev/null @@ -1,472 +0,0 @@ -From d800b1821e4aa3e3e49173be6c5b1ea370200d96 Mon Sep 17 00:00:00 2001 -From: Jose Castro Leon -Date: Wed, 25 Oct 2017 15:39:44 +0200 -Subject: [PATCH] Add support for endpoint group commands - -Implements the commands for endpoint group filter management. -Includes the CRUD management of the endpoint groups and the -association management between them and the projects that are -using this method. - -Implements: blueprint keystone-endpoint-filter -Change-Id: I4265f7f8598d028191e90d76781b7b6ece6fef64 - -Signed-off-by: Kam Nasim ---- - doc/source/cli/command-objects/endpoint_group.rst | 28 ++ - doc/source/cli/commands.rst | 1 + - openstackclient/identity/v3/endpoint_group.py | 324 +++++++++++++++++++++ - openstackclient/tests/unit/identity/v3/fakes.py | 16 + - .../keystone-endpoint-group-0c55debbb66844f2.yaml | 7 + - setup.cfg | 9 + - 6 files changed, 385 insertions(+) - create mode 100644 doc/source/cli/command-objects/endpoint_group.rst - create mode 100644 openstackclient/identity/v3/endpoint_group.py - create mode 100644 releasenotes/notes/keystone-endpoint-group-0c55debbb66844f2.yaml - -diff --git a/doc/source/cli/command-objects/endpoint_group.rst b/doc/source/cli/command-objects/endpoint_group.rst -new file mode 100644 -index 0000000..ccfe5f6 ---- /dev/null -+++ b/doc/source/cli/command-objects/endpoint_group.rst -@@ -0,0 +1,28 @@ -+============== -+endpoint group -+============== -+ -+A **endpoint group** is used to create groups of endpoints that then -+can be used to filter the endpoints that are available to a project. -+Applicable to Identity v3 -+ -+.. autoprogram-cliff:: openstack.identity.v3 -+ :command: endpoint group add project -+ -+.. autoprogram-cliff:: openstack.identity.v3 -+ :command: endpoint group create -+ -+.. autoprogram-cliff:: openstack.identity.v3 -+ :command: endpoint group delete -+ -+.. autoprogram-cliff:: openstack.identity.v3 -+ :command: endpoint group list -+ -+.. autoprogram-cliff:: openstack.identity.v3 -+ :command: endpoint group remove project -+ -+.. autoprogram-cliff:: openstack.identity.v3 -+ :command: endpoint group set -+ -+.. autoprogram-cliff:: openstack.identity.v3 -+ :command: endpoint group show -diff --git a/doc/source/cli/commands.rst b/doc/source/cli/commands.rst -index 5a7977e..50a6f6e 100644 ---- a/doc/source/cli/commands.rst -+++ b/doc/source/cli/commands.rst -@@ -91,6 +91,7 @@ referring to both Compute and Volume quotas. - * ``domain``: (**Identity**) a grouping of projects - * ``ec2 credentials``: (**Identity**) AWS EC2-compatible credentials - * ``endpoint``: (**Identity**) the base URL used to contact a specific service -+* ``endpoint group``: (**Identity**) group endpoints to be used as filters - * ``extension``: (**Compute**, **Identity**, **Network**, **Volume**) OpenStack server API extensions - * ``federation protocol``: (**Identity**) the underlying protocol used while federating identities - * ``flavor``: (**Compute**) predefined server configurations: ram, root disk and so on -diff --git a/openstackclient/identity/v3/endpoint_group.py b/openstackclient/identity/v3/endpoint_group.py -new file mode 100644 -index 0000000..e254973 ---- /dev/null -+++ b/openstackclient/identity/v3/endpoint_group.py -@@ -0,0 +1,324 @@ -+# 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. -+# -+ -+"""Identity v3 Endpoint Group action implementations""" -+ -+import json -+import logging -+ -+from osc_lib.command import command -+from osc_lib import exceptions -+from osc_lib import utils -+import six -+ -+from openstackclient.i18n import _ -+from openstackclient.identity import common -+ -+ -+LOG = logging.getLogger(__name__) -+ -+ -+class _FiltersReader(object): -+ _description = _("Helper class capable of reading filters from files") -+ -+ def _read_filters(self, path): -+ """Read and parse rules from path -+ -+ Expect the file to contain a valid JSON structure. -+ -+ :param path: path to the file -+ :return: loaded and valid dictionary with filters -+ :raises exception.CommandError: In case the file cannot be -+ accessed or the content is not a valid JSON. -+ -+ Example of the content of the file: -+ { -+ "interface": "admin", -+ "service_id": "1b501a" -+ } -+ """ -+ blob = utils.read_blob_file_contents(path) -+ try: -+ rules = json.loads(blob) -+ except ValueError as e: -+ msg = _("An error occurred when reading filters from file " -+ "%(path)s: %(error)s") % {"path": path, "error": e} -+ raise exceptions.CommandError(msg) -+ else: -+ return rules -+ -+ -+class AddProjectToEndpointGroup(command.Command): -+ _description = _("Add a project to an endpoint group") -+ -+ def get_parser(self, prog_name): -+ parser = super( -+ AddProjectToEndpointGroup, self).get_parser(prog_name) -+ parser.add_argument( -+ 'endpointgroup', -+ metavar='', -+ help=_('Endpoint group (name or ID)'), -+ ) -+ parser.add_argument( -+ 'project', -+ metavar='', -+ help=_('Project to associate (name or ID)'), -+ ) -+ common.add_project_domain_option_to_parser(parser) -+ return parser -+ -+ def take_action(self, parsed_args): -+ client = self.app.client_manager.identity -+ -+ endpointgroup = utils.find_resource(client.endpoint_groups, -+ parsed_args.endpointgroup) -+ -+ project = common.find_project(client, -+ parsed_args.project, -+ parsed_args.project_domain) -+ -+ client.endpoint_filter.add_endpoint_group_to_project( -+ endpoint_group=endpointgroup.id, -+ project=project.id) -+ -+ -+class CreateEndpointGroup(command.ShowOne, _FiltersReader): -+ _description = _("Create new endpoint group") -+ -+ def get_parser(self, prog_name): -+ parser = super(CreateEndpointGroup, self).get_parser(prog_name) -+ parser.add_argument( -+ 'name', -+ metavar='', -+ help=_('Name of the endpoint group'), -+ ) -+ parser.add_argument( -+ 'filters', -+ metavar='', -+ help=_('Filename that contains a new set of filters'), -+ ) -+ parser.add_argument( -+ '--description', -+ help=_('Description of the endpoint group'), -+ ) -+ return parser -+ -+ def take_action(self, parsed_args): -+ identity_client = self.app.client_manager.identity -+ -+ filters = None -+ if parsed_args.filters: -+ filters = self._read_filters(parsed_args.filters) -+ -+ endpoint_group = identity_client.endpoint_groups.create( -+ name=parsed_args.name, -+ filters=filters, -+ description=parsed_args.description -+ ) -+ -+ info = {} -+ endpoint_group._info.pop('links') -+ info.update(endpoint_group._info) -+ return zip(*sorted(six.iteritems(info))) -+ -+ -+class DeleteEndpointGroup(command.Command): -+ _description = _("Delete endpoint group(s)") -+ -+ def get_parser(self, prog_name): -+ parser = super(DeleteEndpointGroup, self).get_parser(prog_name) -+ parser.add_argument( -+ 'endpointgroup', -+ metavar='', -+ nargs='+', -+ help=_('Endpoint group(s) to delete (name or ID)'), -+ ) -+ return parser -+ -+ def take_action(self, parsed_args): -+ identity_client = self.app.client_manager.identity -+ result = 0 -+ for i in parsed_args.endpointgroup: -+ try: -+ endpoint_id = utils.find_resource( -+ identity_client.endpoint_groups, i).id -+ identity_client.endpoint_groups.delete(endpoint_id) -+ except Exception as e: -+ result += 1 -+ LOG.error(_("Failed to delete endpoint group with " -+ "ID '%(endpointgroup)s': %(e)s"), -+ {'endpointgroup': i, 'e': e}) -+ -+ if result > 0: -+ total = len(parsed_args.endpointgroup) -+ msg = (_("%(result)s of %(total)s endpointgroups failed " -+ "to delete.") % {'result': result, 'total': total}) -+ raise exceptions.CommandError(msg) -+ -+ -+class ListEndpointGroup(command.Lister): -+ _description = _("List endpoint groups") -+ -+ def get_parser(self, prog_name): -+ parser = super(ListEndpointGroup, self).get_parser(prog_name) -+ list_group = parser.add_mutually_exclusive_group() -+ list_group.add_argument( -+ '--endpointgroup', -+ metavar='', -+ help=_('Endpoint Group (name or ID)'), -+ ) -+ list_group.add_argument( -+ '--project', -+ metavar='', -+ help=_('Project (name or ID)'), -+ ) -+ parser.add_argument( -+ '--domain', -+ metavar='', -+ help=_('Domain owning (name or ID)'), -+ ) -+ return parser -+ -+ def take_action(self, parsed_args): -+ client = self.app.client_manager.identity -+ -+ endpointgroup = None -+ if parsed_args.endpointgroup: -+ endpointgroup = utils.find_resource(client.endpoint_groups, -+ parsed_args.endpointgroup) -+ project = None -+ if parsed_args.project: -+ project = common.find_project(client, -+ parsed_args.project, -+ parsed_args.domain) -+ -+ if endpointgroup: -+ # List projects associated to the endpoint group -+ columns = ('ID', 'Name') -+ data = client.endpoint_filter.list_projects_for_endpoint_group( -+ endpoint_group=endpointgroup.id) -+ elif project: -+ columns = ('ID', 'Name') -+ data = client.endpoint_filter.list_endpoint_groups_for_project( -+ project=project.id) -+ else: -+ columns = ('ID', 'Name', 'Description') -+ data = client.endpoint_groups.list() -+ -+ return (columns, -+ (utils.get_item_properties( -+ s, columns, -+ formatters={}, -+ ) for s in data)) -+ -+ -+class RemoveProjectFromEndpointGroup(command.Command): -+ _description = _("Remove project from endpoint group") -+ -+ def get_parser(self, prog_name): -+ parser = super( -+ RemoveProjectFromEndpointGroup, self).get_parser(prog_name) -+ parser.add_argument( -+ 'endpointgroup', -+ metavar='', -+ help=_('Endpoint group (name or ID)'), -+ ) -+ parser.add_argument( -+ 'project', -+ metavar='', -+ help=_('Project to remove (name or ID)'), -+ ) -+ common.add_project_domain_option_to_parser(parser) -+ return parser -+ -+ def take_action(self, parsed_args): -+ client = self.app.client_manager.identity -+ -+ endpointgroup = utils.find_resource(client.endpoint_groups, -+ parsed_args.endpointgroup) -+ -+ project = common.find_project(client, -+ parsed_args.project, -+ parsed_args.project_domain) -+ -+ client.endpoint_filter.delete_endpoint_group_to_project( -+ endpoint_group=endpointgroup.id, -+ project=project.id) -+ -+ -+class SetEndpointGroup(command.Command, _FiltersReader): -+ _description = _("Set endpoint group properties") -+ -+ def get_parser(self, prog_name): -+ parser = super(SetEndpointGroup, self).get_parser(prog_name) -+ parser.add_argument( -+ 'endpointgroup', -+ metavar='', -+ help=_('Endpoint Group to modify (name or ID)'), -+ ) -+ parser.add_argument( -+ '--name', -+ metavar='', -+ help=_('New enpoint group name'), -+ ) -+ parser.add_argument( -+ '--filters', -+ metavar='', -+ help=_('Filename that contains a new set of filters'), -+ ) -+ parser.add_argument( -+ '--description', -+ metavar='', -+ default='', -+ help=_('New endpoint group description'), -+ ) -+ return parser -+ -+ def take_action(self, parsed_args): -+ identity_client = self.app.client_manager.identity -+ endpointgroup = utils.find_resource(identity_client.endpoint_groups, -+ parsed_args.endpointgroup) -+ -+ filters = None -+ if parsed_args.filters: -+ filters = self._read_filters(parsed_args.filters) -+ -+ identity_client.endpoint_groups.update( -+ endpointgroup.id, -+ name=parsed_args.name, -+ filters=filters, -+ description=parsed_args.description -+ ) -+ -+ -+class ShowEndpointGroup(command.ShowOne): -+ _description = _("Display endpoint group details") -+ -+ def get_parser(self, prog_name): -+ parser = super(ShowEndpointGroup, self).get_parser(prog_name) -+ parser.add_argument( -+ 'endpointgroup', -+ metavar='', -+ help=_('Endpoint group (name or ID)'), -+ ) -+ return parser -+ -+ def take_action(self, parsed_args): -+ identity_client = self.app.client_manager.identity -+ endpoint_group = utils.find_resource(identity_client.endpoint_groups, -+ parsed_args.endpointgroup) -+ -+ info = {} -+ endpoint_group._info.pop('links') -+ info.update(endpoint_group._info) -+ return zip(*sorted(six.iteritems(info))) -diff --git a/openstackclient/tests/unit/identity/v3/fakes.py b/openstackclient/tests/unit/identity/v3/fakes.py -index 549a1aa..76431b1 100644 ---- a/openstackclient/tests/unit/identity/v3/fakes.py -+++ b/openstackclient/tests/unit/identity/v3/fakes.py -@@ -221,6 +221,20 @@ ENDPOINT = { - 'links': base_url + 'endpoints/' + endpoint_id, - } - -+endpoint_group_id = 'eg-123' -+endpoint_group_description = 'eg 123 description' -+endpoint_group_filters = { -+ 'service_id': service_id, -+ 'region_id': endpoint_region, -+} -+ -+ENDPOINT_GROUP = { -+ 'id': endpoint_group_id, -+ 'filters': endpoint_group_filters, -+ 'description': endpoint_group_description, -+ 'links': base_url + 'endpoint_groups/' + endpoint_group_id, -+} -+ - user_id = 'bbbbbbb-aaaa-aaaa-aaaa-bbbbbbbaaaa' - user_name = 'paul' - user_description = 'Sir Paul' -@@ -493,6 +507,8 @@ class FakeIdentityv3Client(object): - self.endpoints.resource_class = fakes.FakeResource(None, {}) - self.endpoint_filter = mock.Mock() - self.endpoint_filter.resource_class = fakes.FakeResource(None, {}) -+ self.endpoint_groups = mock.Mock() -+ self.endpoint_groups.resource_class = fakes.FakeResource(None, {}) - self.groups = mock.Mock() - self.groups.resource_class = fakes.FakeResource(None, {}) - self.oauth1 = mock.Mock() -diff --git a/releasenotes/notes/keystone-endpoint-group-0c55debbb66844f2.yaml b/releasenotes/notes/keystone-endpoint-group-0c55debbb66844f2.yaml -new file mode 100644 -index 0000000..dc3c5be ---- /dev/null -+++ b/releasenotes/notes/keystone-endpoint-group-0c55debbb66844f2.yaml -@@ -0,0 +1,7 @@ -+--- -+features: -+ - | -+ Add endpoint group commands: ``endpoint group add project``, ``endpoint group create``, -+ ``endpoint group delete``, ``endpoint group list``, ``endpoint group remove project``, -+ ``endpoint group set`` and ``endpoint group show``. -+ [Blueprint `keystone-endpoint-filter `_] -diff --git a/setup.cfg b/setup.cfg -index 5f9c04a..d87b387 100644 ---- a/setup.cfg -+++ b/setup.cfg -@@ -202,6 +202,15 @@ openstack.identity.v3 = - endpoint_remove_project = openstackclient.identity.v3.endpoint:RemoveProjectFromEndpoint - endpoint_set = openstackclient.identity.v3.endpoint:SetEndpoint - endpoint_show = openstackclient.identity.v3.endpoint:ShowEndpoint -+ -+ endpoint_group_add_project = openstackclient.identity.v3.endpoint_group:AddProjectToEndpointGroup -+ endpoint_group_create = openstackclient.identity.v3.endpoint_group:CreateEndpointGroup -+ endpoint_group_delete = openstackclient.identity.v3.endpoint_group:DeleteEndpointGroup -+ endpoint_group_list = openstackclient.identity.v3.endpoint_group:ListEndpointGroup -+ endpoint_group_remove_project = openstackclient.identity.v3.endpoint_group:RemoveProjectFromEndpointGroup -+ endpoint_group_set = openstackclient.identity.v3.endpoint_group:SetEndpointGroup -+ endpoint_group_show = openstackclient.identity.v3.endpoint_group:ShowEndpointGroup -+ - group_add_user = openstackclient.identity.v3.group:AddUserToGroup - group_contains_user = openstackclient.identity.v3.group:CheckUserInGroup - group_create = openstackclient.identity.v3.group:CreateGroup --- -1.8.3.1 - diff --git a/openstack/python-openstackclient/centos/patches/CGTS-7814-warning-only-when-the-admin-password-chang.patch b/openstack/python-openstackclient/centos/patches/CGTS-7814-warning-only-when-the-admin-password-chang.patch deleted file mode 100644 index b2dfb0e5..00000000 --- a/openstack/python-openstackclient/centos/patches/CGTS-7814-warning-only-when-the-admin-password-chang.patch +++ /dev/null @@ -1,42 +0,0 @@ -From a2f2306ae12c65d0758a63781ace5d3e6cf0df7f Mon Sep 17 00:00:00 2001 -From: jmckenna -Date: Fri, 6 Oct 2017 10:40:12 -0400 -Subject: [PATCH] [PATCH] CGTS-7814: warning only when the admin password - change accepted - -Currently admin password change CLI warning coming even when new -Password Change is not accepted. The patch fixed this by moving -the warning from keystoneclient to openstackclienti, after the -password update call. - -diff --git a/openstackclient/identity/v3/user.py b/openstackclient/identity/v3/user.py -index 201d217..e94ec1f 100644 ---- a/openstackclient/identity/v3/user.py -+++ b/openstackclient/identity/v3/user.py -@@ -392,7 +392,7 @@ class SetUser(command.Command): - kwargs['enabled'] = False - - identity_client.users.update(user.id, **kwargs) -- if user.name == 'admin' : -+ if user.name == 'admin' and 'password' in kwargs : - print("Warning: '%s' password changed. Please wait 5 minutes " - "before Locking/Unlocking the controllers for the password " - "change to come into effect\n" %(user.name)) -@@ -456,6 +456,17 @@ class SetPasswordUser(command.Command): - - identity_client.users.update_password(current_password, password) - -+ # retrieve the authentication information from the cached token session -+ session_auth = identity_client.session.auth -+ username = "" -+ if "username" in session_auth.__dict__: -+ username = session_auth.username -+ elif "_username" in session_auth.__dict__: -+ username = session_auth._username -+ if username == 'admin' : -+ print("Warning: '%s' password changed. Please wait 5 minutes " -+ "before Locking/Unlocking the controllers for the password " -+ "change to come into effect\n" %(username)) - - class ShowUser(command.ShowOne): - _description = _("Display user details") diff --git a/openstack/python-openstackclient/centos/patches/openstackClient_Passwordchange_warning.patch b/openstack/python-openstackclient/centos/patches/openstackClient_Passwordchange_warning.patch deleted file mode 100644 index 70644454..00000000 --- a/openstack/python-openstackclient/centos/patches/openstackClient_Passwordchange_warning.patch +++ /dev/null @@ -1,28 +0,0 @@ - From be8b4cdf2939d5cd2bf3f2a38534f0d760f63413 Mon Sep 17 00:00:00 2001 -From: jmckenna -Date: Fri, 6 Oct 2017 10:38:33 -0400 -Subject: [PATCH] CGTS-6766: Openstack client logging a warning message when - 'admin' user password is changed using 'openstack user set'CLI command - ---- - openstackclient/identity/v3/user.py | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/openstackclient/identity/v3/user.py b/openstackclient/identity/v3/user.py -index 5f4fb54..201d217 100644 ---- a/openstackclient/identity/v3/user.py -+++ b/openstackclient/identity/v3/user.py -@@ -392,6 +392,10 @@ class SetUser(command.Command): - kwargs['enabled'] = False - - identity_client.users.update(user.id, **kwargs) -+ if user.name == 'admin' : -+ print("Warning: '%s' password changed. Please wait 5 minutes " -+ "before Locking/Unlocking the controllers for the password " -+ "change to come into effect\n" %(user.name)) - - - class SetPasswordUser(command.Command): --- -1.8.3.1 - diff --git a/openstack/python-openstackclient/centos/python-openstackclient.spec b/openstack/python-openstackclient/centos/python-openstackclient.spec new file mode 100644 index 00000000..b8e40965 --- /dev/null +++ b/openstack/python-openstackclient/centos/python-openstackclient.spec @@ -0,0 +1,305 @@ +%{!?upstream_version: %global upstream_version %{version}%{?milestone}} + +# Python3 support in OpenStack starts with version 3.5, +# which is only in Fedora 24+ +%if 0%{?fedora} >= 24 +%global with_python3 1 +%endif + +%global client openstackclient +%global with_doc 0 +%global with_check 0 + +%global common_desc \ +python-openstackclient is a unified command-line client for the OpenStack APIs. \ +It is a thin wrapper to the stock python-*client modules that implement the \ +actual REST API client actions. + +Name: python-openstackclient +Version: 3.16.2 +Release: 1%{?_tis_dist}.%{tis_patch_ver} +Summary: OpenStack Command-line Client + +License: ASL 2.0 +URL: http://launchpad.net/%{name} +Source0: https://tarballs.openstack.org/%{name}/%{name}-%{upstream_version}.tar.gz +Patch0001: 0001-Add-network-segment-range-command-object.patch + +BuildArch: noarch + +BuildRequires: git +BuildRequires: openstack-macros + +%description +%{common_desc} + +%package -n python2-%{client} +Summary: OpenStack Command-line Client +%{?python_provide:%python_provide python2-%{client}} + +BuildRequires: python2-devel +BuildRequires: python2-setuptools +BuildRequires: python2-pip +BuildRequires: python2-wheel +BuildRequires: python2-pbr +BuildRequires: python2-six +BuildRequires: python2-oslo-i18n +BuildRequires: python2-oslo-utils +BuildRequires: python2-requests +BuildRequires: python2-glanceclient +BuildRequires: python2-keystoneclient +BuildRequires: python2-novaclient +BuildRequires: python2-cinderclient +BuildRequires: python2-mock +BuildRequires: python2-os-client-config +%if 0%{?fedora} > 0 +BuildRequires: python2-d2to1 +BuildRequires: python2-cliff +BuildRequires: python2-simplejson +BuildRequires: python2-requests-mock +%else +BuildRequires: python-d2to1 +BuildRequires: python-cliff +BuildRequires: python-simplejson +BuildRequires: python-requests-mock +%endif +# Required to compile translation files +BuildRequires: python2-babel +# Required for unit tests +BuildRequires: python2-os-testr +BuildRequires: python2-osc-lib-tests +BuildRequires: python2-fixtures +BuildRequires: python2-oslotest +BuildRequires: python2-reno +BuildRequires: python2-requestsexceptions +BuildRequires: python2-openstacksdk +BuildRequires: python2-osprofiler + +Requires: python2-pbr +Requires: python2-babel +Requires: python2-openstacksdk >= 0.11.2 +Requires: python2-oslo-i18n >= 3.15.3 +Requires: python2-oslo-utils >= 3.33.0 +Requires: python2-glanceclient >= 1:2.8.0 +Requires: python2-keystoneauth1 >= 3.4.0 +Requires: python2-keystoneclient >= 1:3.17.0 +Requires: python2-novaclient >= 9.1.0 +Requires: python2-cinderclient >= 3.3.0 +Requires: python2-neutronclient >= 6.7.0 +Requires: python2-six >= 1.10.0 +Requires: python2-osc-lib >= 1.10.0 +%if 0%{?fedora} > 0 +Requires: python2-cliff +%else +Requires: python-cliff +%endif +Requires: python-%{client}-lang = %{version}-%{release} + + +%description -n python2-%{client} +%{common_desc} + +%if 0%{?with_doc} +%package -n python-%{client}-doc +Summary: Documentation for OpenStack Command-line Client + +BuildRequires: python2-sphinx +BuildRequires: python2-openstackdocstheme +BuildRequires: python2-sphinxcontrib-apidoc + +Requires: %{name} = %{version}-%{release} + +%description -n python-%{client}-doc +%{common_desc} + +This package contains auto-generated documentation. +%endif + +%package -n python-%{client}-lang +Summary: Translation files for Openstackclient + +%description -n python-%{client}-lang +Translation files for Openstackclient + +%if 0%{?with_python3} +%package -n python3-%{client} +Summary: OpenStack Command-line Client +%{?python_provide:%python_provide python3-%{client}} + +BuildRequires: python3-devel +BuildRequires: python3-setuptools +BuildRequires: python3-pbr +BuildRequires: python3-d2to1 +BuildRequires: python3-oslo-sphinx +BuildRequires: python3-six +BuildRequires: python3-cliff +BuildRequires: python3-oslo-i18n +BuildRequires: python3-oslo-utils +BuildRequires: python3-simplejson +BuildRequires: python3-requests +BuildRequires: python3-glanceclient +BuildRequires: python3-keystoneclient +BuildRequires: python3-novaclient +BuildRequires: python3-cinderclient +BuildRequires: python3-mock +BuildRequires: python3-requests-mock +BuildRequires: python3-os-client-config +# Required to compile translation files +BuildRequires: python3-babel +# Required for unit tests +BuildRequires: python3-os-testr +BuildRequires: python3-osc-lib-tests +BuildRequires: python3-coverage +BuildRequires: python3-fixtures +BuildRequires: python3-oslotest +BuildRequires: python3-reno +BuildRequires: python3-requestsexceptions +BuildRequires: python3-openstacksdk +BuildRequires: python3-osprofiler + +Requires: python3-pbr +Requires: python3-babel +Requires: python3-cliff +Requires: python3-openstacksdk >= 0.11.2 +Requires: python3-oslo-i18n >= 3.15.3 +Requires: python3-oslo-utils >= 3.33.0 +Requires: python3-glanceclient >= 1:2.8.0 +Requires: python3-keystoneauth1 >= 3.4.0 +Requires: python3-keystoneclient >= 1:3.17.0 +Requires: python3-novaclient >= 9.1.0 +Requires: python3-cinderclient >= 3.3.0 +Requires: python3-neutronclient >= 6.7.0 +Requires: python3-six >= 1.10.0 +Requires: python3-osc-lib >= 1.10.0 +Requires: python-%{client}-lang = %{version}-%{release} + +%description -n python3-%{client} +%{common_desc} +%endif + +%prep +%autosetup -n %{name}-%{upstream_version} -S git + +# We handle requirements ourselves, pkg_resources only bring pain +%py_req_cleanup + +%build +export PBR_VERSION=%{version} +%py2_build +%py2_build_wheel +%if 0%{?with_python3} +%py3_build +%endif + +# Generate i18n files +%{__python2} setup.py compile_catalog -d build/lib/openstackclient/locale + +%install +export PBR_VERSION=%{version} +%if 0%{?with_python3} +%py3_install +mv %{buildroot}%{_bindir}/openstack %{buildroot}%{_bindir}/openstack-%{python3_version} +ln -s ./openstack-%{python3_version} %{buildroot}%{_bindir}/openstack-3 +%endif + +%{__python2} setup.py install -O1 --skip-build --root %{buildroot} +ln -s ./openstack %{buildroot}%{_bindir}/openstack-2 +ln -s ./openstack %{buildroot}%{_bindir}/openstack-%{python2_version} + +%if 0%{?with_doc} +sphinx-build -b html doc/source doc/build/html +sphinx-build -b man doc/source doc/build/man +install -p -D -m 644 doc/build/man/openstack.1 %{buildroot}%{_mandir}/man1/openstack.1 + +# Fix hidden-file-or-dir warnings +rm -fr doc/build/html/.doctrees doc/build/html/.buildinfo doc/build/html/.htaccess +%endif + +# Install i18n .mo files (.po and .pot are not required) +install -d -m 755 %{buildroot}%{_datadir} +rm -f %{buildroot}%{python2_sitelib}/openstackclient/locale/*/LC_*/openstackclient*po +rm -f %{buildroot}%{python2_sitelib}/openstackclient/locale/*pot +mv %{buildroot}%{python2_sitelib}/openstackclient/locale %{buildroot}%{_datadir}/locale + +%if 0%{?with_python3} +rm -rf %{buildroot}%{python3_sitelib}/openstackclient/locale +%endif + +# Find language files +%find_lang openstackclient --all-name + +# STX: stage wheels +mkdir -p $RPM_BUILD_ROOT/wheels +install -m 644 dist/*.whl $RPM_BUILD_ROOT/wheels/ + +# STX: prep SDK package +mkdir -p %{buildroot}/usr/share/remote-clients +tar zcf %{buildroot}/usr/share/remote-clients/%{name}-%{version}.tgz --exclude='.gitignore' --exclude='.gitreview' -C .. %{name}-%{version} + + +%check +%if 0%{?with_check} +%{__python2} setup.py test +%if 0%{?with_python3} +rm -rf .testrepository +%{__python3} setup.py test +%endif +%endif + +%files -n python2-%{client} +%license LICENSE +%doc README.rst +%{_bindir}/openstack +%{_bindir}/openstack-2 +%{_bindir}/openstack-%{python2_version} +%{python2_sitelib}/openstackclient +%{python2_sitelib}/*.egg-info +%if 0%{?with_doc} +%{_mandir}/man1/openstack.1* + +%files -n python-%{client}-doc +%license LICENSE +%doc doc/build/html +%endif + +%files -n python-%{client}-lang -f openstackclient.lang +%license LICENSE + +%if 0%{?with_python3} +%files -n python3-%{client} +%license LICENSE +%doc README.rst +%{_bindir}/openstack-3 +%{_bindir}/openstack-%{python3_version} +%{python3_sitelib}/openstackclient +%{python3_sitelib}/*.egg-info +%endif + +%package sdk +Summary: SDK files for %{name} + +%description sdk +Contains SDK files for %{name} package + +%files sdk +/usr/share/remote-clients/%{name}-%{version}.tgz + +%package wheels +Summary: %{name} wheels + +%description wheels +Contains python wheels for %{name} + +%files wheels +/wheels/* + +%changelog +* Tue Nov 27 2018 RDO 3.16.2-1 +- Update to 3.16.2 + +* Thu Sep 20 2018 RDO 3.16.1-1 +- Update to 3.16.1 + +* Thu Aug 09 2018 RDO 3.16.0-1 +- Update to 3.16.0 + diff --git a/openstack/python-openstackclient/centos/python-openstackclient.spec.orig b/openstack/python-openstackclient/centos/python-openstackclient.spec.orig new file mode 100644 index 00000000..e6d7994e --- /dev/null +++ b/openstack/python-openstackclient/centos/python-openstackclient.spec.orig @@ -0,0 +1,268 @@ +%{!?upstream_version: %global upstream_version %{version}%{?milestone}} + +# Python3 support in OpenStack starts with version 3.5, +# which is only in Fedora 24+ +%if 0%{?fedora} >= 24 +%global with_python3 1 +%endif + +%global client openstackclient +%global with_doc 1 + +%global common_desc \ +python-openstackclient is a unified command-line client for the OpenStack APIs. \ +It is a thin wrapper to the stock python-*client modules that implement the \ +actual REST API client actions. + +Name: python-openstackclient +Version: 3.16.2 +Release: 1%{?dist} +Summary: OpenStack Command-line Client + +License: ASL 2.0 +URL: http://launchpad.net/%{name} +Source0: https://tarballs.openstack.org/%{name}/%{name}-%{upstream_version}.tar.gz + +BuildArch: noarch + +BuildRequires: git +BuildRequires: openstack-macros + +%description +%{common_desc} + +%package -n python2-%{client} +Summary: OpenStack Command-line Client +%{?python_provide:%python_provide python2-%{client}} + +BuildRequires: python2-devel +BuildRequires: python2-setuptools +BuildRequires: python2-pbr +BuildRequires: python2-six +BuildRequires: python2-oslo-i18n +BuildRequires: python2-oslo-utils +BuildRequires: python2-requests +BuildRequires: python2-glanceclient +BuildRequires: python2-keystoneclient +BuildRequires: python2-novaclient +BuildRequires: python2-cinderclient +BuildRequires: python2-mock +BuildRequires: python2-os-client-config +%if 0%{?fedora} > 0 +BuildRequires: python2-d2to1 +BuildRequires: python2-cliff +BuildRequires: python2-simplejson +BuildRequires: python2-requests-mock +%else +BuildRequires: python-d2to1 +BuildRequires: python-cliff +BuildRequires: python-simplejson +BuildRequires: python-requests-mock +%endif +# Required to compile translation files +BuildRequires: python2-babel +# Required for unit tests +BuildRequires: python2-os-testr +BuildRequires: python2-osc-lib-tests +BuildRequires: python2-fixtures +BuildRequires: python2-oslotest +BuildRequires: python2-reno +BuildRequires: python2-requestsexceptions +BuildRequires: python2-openstacksdk +BuildRequires: python2-osprofiler + +Requires: python2-pbr +Requires: python2-babel +Requires: python2-openstacksdk >= 0.11.2 +Requires: python2-oslo-i18n >= 3.15.3 +Requires: python2-oslo-utils >= 3.33.0 +Requires: python2-glanceclient >= 1:2.8.0 +Requires: python2-keystoneauth1 >= 3.4.0 +Requires: python2-keystoneclient >= 1:3.17.0 +Requires: python2-novaclient >= 9.1.0 +Requires: python2-cinderclient >= 3.3.0 +Requires: python2-neutronclient >= 6.7.0 +Requires: python2-six >= 1.10.0 +Requires: python2-osc-lib >= 1.10.0 +%if 0%{?fedora} > 0 +Requires: python2-cliff +%else +Requires: python-cliff +%endif +Requires: python-%{client}-lang = %{version}-%{release} + + +%description -n python2-%{client} +%{common_desc} + +%if 0%{?with_doc} +%package -n python-%{client}-doc +Summary: Documentation for OpenStack Command-line Client + +BuildRequires: python2-sphinx +BuildRequires: python2-openstackdocstheme +BuildRequires: python2-sphinxcontrib-apidoc + +Requires: %{name} = %{version}-%{release} + +%description -n python-%{client}-doc +%{common_desc} + +This package contains auto-generated documentation. +%endif + +%package -n python-%{client}-lang +Summary: Translation files for Openstackclient + +%description -n python-%{client}-lang +Translation files for Openstackclient + +%if 0%{?with_python3} +%package -n python3-%{client} +Summary: OpenStack Command-line Client +%{?python_provide:%python_provide python3-%{client}} + +BuildRequires: python3-devel +BuildRequires: python3-setuptools +BuildRequires: python3-pbr +BuildRequires: python3-d2to1 +BuildRequires: python3-oslo-sphinx +BuildRequires: python3-six +BuildRequires: python3-cliff +BuildRequires: python3-oslo-i18n +BuildRequires: python3-oslo-utils +BuildRequires: python3-simplejson +BuildRequires: python3-requests +BuildRequires: python3-glanceclient +BuildRequires: python3-keystoneclient +BuildRequires: python3-novaclient +BuildRequires: python3-cinderclient +BuildRequires: python3-mock +BuildRequires: python3-requests-mock +BuildRequires: python3-os-client-config +# Required to compile translation files +BuildRequires: python3-babel +# Required for unit tests +BuildRequires: python3-os-testr +BuildRequires: python3-osc-lib-tests +BuildRequires: python3-coverage +BuildRequires: python3-fixtures +BuildRequires: python3-oslotest +BuildRequires: python3-reno +BuildRequires: python3-requestsexceptions +BuildRequires: python3-openstacksdk +BuildRequires: python3-osprofiler + +Requires: python3-pbr +Requires: python3-babel +Requires: python3-cliff +Requires: python3-openstacksdk >= 0.11.2 +Requires: python3-oslo-i18n >= 3.15.3 +Requires: python3-oslo-utils >= 3.33.0 +Requires: python3-glanceclient >= 1:2.8.0 +Requires: python3-keystoneauth1 >= 3.4.0 +Requires: python3-keystoneclient >= 1:3.17.0 +Requires: python3-novaclient >= 9.1.0 +Requires: python3-cinderclient >= 3.3.0 +Requires: python3-neutronclient >= 6.7.0 +Requires: python3-six >= 1.10.0 +Requires: python3-osc-lib >= 1.10.0 +Requires: python-%{client}-lang = %{version}-%{release} + +%description -n python3-%{client} +%{common_desc} +%endif + +%prep +%autosetup -n %{name}-%{upstream_version} -S git + +# We handle requirements ourselves, pkg_resources only bring pain +%py_req_cleanup + +%build +%py2_build +%if 0%{?with_python3} +%py3_build +%endif + +# Generate i18n files +%{__python2} setup.py compile_catalog -d build/lib/openstackclient/locale + +%install +%if 0%{?with_python3} +%py3_install +mv %{buildroot}%{_bindir}/openstack %{buildroot}%{_bindir}/openstack-%{python3_version} +ln -s ./openstack-%{python3_version} %{buildroot}%{_bindir}/openstack-3 +%endif + +%{__python2} setup.py install -O1 --skip-build --root %{buildroot} +ln -s ./openstack %{buildroot}%{_bindir}/openstack-2 +ln -s ./openstack %{buildroot}%{_bindir}/openstack-%{python2_version} + +%if 0%{?with_doc} +sphinx-build -b html doc/source doc/build/html +sphinx-build -b man doc/source doc/build/man +install -p -D -m 644 doc/build/man/openstack.1 %{buildroot}%{_mandir}/man1/openstack.1 + +# Fix hidden-file-or-dir warnings +rm -fr doc/build/html/.doctrees doc/build/html/.buildinfo doc/build/html/.htaccess +%endif + +# Install i18n .mo files (.po and .pot are not required) +install -d -m 755 %{buildroot}%{_datadir} +rm -f %{buildroot}%{python2_sitelib}/openstackclient/locale/*/LC_*/openstackclient*po +rm -f %{buildroot}%{python2_sitelib}/openstackclient/locale/*pot +mv %{buildroot}%{python2_sitelib}/openstackclient/locale %{buildroot}%{_datadir}/locale + +%if 0%{?with_python3} +rm -rf %{buildroot}%{python3_sitelib}/openstackclient/locale +%endif + +# Find language files +%find_lang openstackclient --all-name + +%check +%{__python2} setup.py test +%if 0%{?with_python3} +rm -rf .testrepository +%{__python3} setup.py test +%endif + +%files -n python2-%{client} +%license LICENSE +%doc README.rst +%{_bindir}/openstack +%{_bindir}/openstack-2 +%{_bindir}/openstack-%{python2_version} +%{python2_sitelib}/openstackclient +%{python2_sitelib}/*.egg-info +%if 0%{?with_doc} +%{_mandir}/man1/openstack.1* + +%files -n python-%{client}-doc +%license LICENSE +%doc doc/build/html +%endif + +%files -n python-%{client}-lang -f openstackclient.lang +%license LICENSE + +%if 0%{?with_python3} +%files -n python3-%{client} +%license LICENSE +%doc README.rst +%{_bindir}/openstack-3 +%{_bindir}/openstack-%{python3_version} +%{python3_sitelib}/openstackclient +%{python3_sitelib}/*.egg-info +%endif +%changelog +* Tue Nov 27 2018 RDO 3.16.2-1 +- Update to 3.16.2 + +* Thu Sep 20 2018 RDO 3.16.1-1 +- Update to 3.16.1 + +* Thu Aug 09 2018 RDO 3.16.0-1 +- Update to 3.16.0 + diff --git a/openstack/python-openstackclient/centos/srpm_path b/openstack/python-openstackclient/centos/srpm_path deleted file mode 100644 index 4f95b235..00000000 --- a/openstack/python-openstackclient/centos/srpm_path +++ /dev/null @@ -1 +0,0 @@ -mirror:Source/python-openstackclient-3.12.1-1.el7.src.rpm diff --git a/openstack/python-openstacksdk/centos/build_srpm.data b/openstack/python-openstacksdk/centos/build_srpm.data index b77bf787..59c953f0 100644 --- a/openstack/python-openstacksdk/centos/build_srpm.data +++ b/openstack/python-openstacksdk/centos/build_srpm.data @@ -1,3 +1,3 @@ +TAR_NAME=openstacksdk SRC_DIR="$CGCS_BASE/git/python-openstacksdk" -TIS_BASE_SRCREV=7d723da3ffe9861e6e9abcaeadc1991689f782c5 -TIS_PATCH_VER=GITREVCOUNT +TIS_PATCH_VER=0 diff --git a/openstack/python-openstacksdk/centos/python-openstacksdk.spec b/openstack/python-openstacksdk/centos/python-openstacksdk.spec index 7100794d..ce2f9280 100644 --- a/openstack/python-openstacksdk/centos/python-openstacksdk.spec +++ b/openstack/python-openstacksdk/centos/python-openstacksdk.spec @@ -3,25 +3,36 @@ %global with_python3 1 %endif -# Disable docs while openstackdocstheme is packaged +# Disable docs until bs4 package is available %global with_doc 0 +# STX: Disable unit tests as part of build +%global do_check 0 + %global pypi_name openstacksdk +%global common_desc \ +A collection of libraries for building applications to work with OpenStack \ +clouds. + +%global common_desc_tests \ +A collection of libraries for building applications to work with OpenStack \ +clouds - test files + Name: python-%{pypi_name} -Version: 0.9.17 -Release: 0%{?_tis_dist}.%{tis_patch_ver} +Version: 0.17.2 +Release: 1%{?_tis_dist}.%{tis_patch_ver} Summary: An SDK for building applications to work with OpenStack License: ASL 2.0 URL: http://www.openstack.org/ -Source0: %{name}-%{version}%{?milestone}.tar.gz +Source0: https://pypi.io/packages/source/o/%{pypi_name}/%{pypi_name}-%{upstream_version}.tar.gz BuildArch: noarch +BuildRequires: git %description -A collection of libraries for building applications to work with OpenStack -clouds. +%{common_desc} %package -n python2-%{pypi_name} Summary: An SDK for building applications to work with OpenStack @@ -30,37 +41,71 @@ Summary: An SDK for building applications to work with OpenStack BuildRequires: python2-devel BuildRequires: python2-pip BuildRequires: python2-wheel -BuildRequires: python-pbr >= 2.0.0 -BuildRequires: python-sphinx -BuildRequires: python-oslo-sphinx -BuildRequires: python-requests -BuildRequires: python-keystoneauth1 -BuildRequires: python-oslo-utils -BuildRequires: python-deprecation -BuildRequires: python-os-client-config +BuildRequires: python2-pbr >= 2.0.0 +BuildRequires: python2-sphinx +BuildRequires: python2-openstackdocstheme +BuildRequires: python2-keystoneauth1 +BuildRequires: python2-appdirs +BuildRequires: python2-requestsexceptions +BuildRequires: python2-munch +BuildRequires: python2-jmespath +BuildRequires: python2-futures +BuildRequires: python2-jsonschema +BuildRequires: python2-os-service-types # Test requirements -BuildRequires: python-coverage -BuildRequires: python-iso8601 >= 0.1.11 -BuildRequires: python-jsonpatch >= 1.1 -BuildRequires: python-subunit -BuildRequires: python-os-testr -BuildRequires: python-mock -BuildRequires: python-testrepository -BuildRequires: python-testscenarios -BuildRequires: python-testtools +BuildRequires: python2-deprecation +BuildRequires: python2-iso8601 >= 0.1.11 +BuildRequires: python2-jsonpatch >= 1.6 +BuildRequires: python2-subunit +BuildRequires: python2-oslotest +BuildRequires: python2-stestr +BuildRequires: python2-mock +BuildRequires: python2-testrepository +BuildRequires: python2-testscenarios +BuildRequires: python2-testtools +BuildRequires: python2-glanceclient +%if 0%{?fedora} || 0%{?rhel} > 7 +BuildRequires: python2-requests-mock +BuildRequires: python2-decorator +BuildRequires: python2-dogpile-cache +BuildRequires: python2-ipaddress +BuildRequires: python2-netifaces +%else +BuildRequires: python-requests-mock +BuildRequires: python-decorator +BuildRequires: python-dogpile-cache +BuildRequires: python-ipaddress +BuildRequires: python-netifaces +%endif -Requires: python-deprecation -Requires: python-jsonpatch >= 1.1 -Requires: python-iso8601 >= 0.1.11 -Requires: python-keystoneauth1 >= 3.1.0 -Requires: python-os-client-config >= 1.28.0 -Requires: python-oslo-utils -Requires: python-six -Requires: python-stevedore +Requires: python2-deprecation +Requires: python2-jsonpatch >= 1.16 +Requires: python2-keystoneauth1 >= 3.8.0 +Requires: python2-six +Requires: python2-pbr >= 2.0.0 +Requires: python2-appdirs +Requires: python2-requestsexceptions >= 1.2.0 +Requires: python2-munch +Requires: python2-jmespath +Requires: python2-futures +Requires: python2-iso8601 +Requires: python2-os-service-types >= 1.2.0 +%if 0%{?fedora} || 0%{?rhel} > 7 +Requires: python2-decorator +Requires: python2-dogpile-cache +Requires: python2-ipaddress +Requires: python2-netifaces +Requires: python2-pyyaml +%else +Requires: python-decorator +Requires: python-dogpile-cache +Requires: python-ipaddress +Requires: python-netifaces +Requires: PyYAML +%endif %description -n python2-%{pypi_name} -A collection of libraries for building applications to work with OpenStack -clouds. +%{common_desc} %package -n python2-%{pypi_name}-tests Summary: An SDK for building applications to work with OpenStack - test files @@ -68,47 +113,58 @@ Summary: An SDK for building applications to work with OpenStack - test f Requires: python2-%{pypi_name} = %{version}-%{release} %description -n python2-%{pypi_name}-tests -A collection of libraries for building applications to work with OpenStack -clouds - test files - -%package sdk -Summary: SDK files for %{name} - -%description sdk -Contains SDK files for %{name} package - +%{common_desc_tests} %if 0%{?with_python3} %package -n python3-%{pypi_name} Summary: An SDK for building applications to work with OpenStack %{?python_provide:%python_provide python3-%{pypi_name}} - + BuildRequires: python3-devel -BuildRequires: python3-pbr >= 1.8 -BuildRequires: python3-sphinx -BuildRequires: python3-oslo-sphinx -BuildRequires: python3-requests +BuildRequires: python3-pbr >= 2.0.0 BuildRequires: python3-keystoneauth1 -BuildRequires: python3-oslo-utils -BuildRequires: python3-os-client-config +BuildRequires: python3-dogpile-cache +BuildRequires: python3-appdirs +BuildRequires: python3-requestsexceptions +BuildRequires: python3-munch +BuildRequires: python3-decorator +BuildRequires: python3-jmespath +BuildRequires: python3-netifaces +BuildRequires: python3-jsonschema +BuildRequires: python3-os-service-types # Test requirements -BuildRequires: python3-coverage +BuildRequires: python3-deprecation +BuildRequires: python3-iso8601 >= 0.1.11 +BuildRequires: python3-jsonpatch >= 1.6 BuildRequires: python3-subunit -BuildRequires: python3-os-testr +BuildRequires: python3-oslotest +BuildRequires: python3-stestr BuildRequires: python3-mock +BuildRequires: python3-requests-mock BuildRequires: python3-testrepository BuildRequires: python3-testscenarios BuildRequires: python3-testtools +BuildRequires: python3-glanceclient -Requires: python3-keystoneauth1 -Requires: python3-os-client-config -Requires: python3-oslo-utils +Requires: python3-deprecation +Requires: python3-jsonpatch >= 1.16 +Requires: python3-keystoneauth1 >= 3.8.0 Requires: python3-six -Requires: python3-stevedore +Requires: python3-pbr >= 2.0.0 +Requires: python3-PyYAML +Requires: python3-appdirs +Requires: python3-requestsexceptions >= 1.2.0 +Requires: python3-dogpile-cache +Requires: python3-munch +Requires: python3-decorator +Requires: python3-jmespath +Requires: python3-netifaces +Requires: python3-jsonschema +Requires: python3-iso8601 +Requires: python3-os-service-types >= 1.2.0 %description -n python3-%{pypi_name} -A collection of libraries for building applications to work with OpenStack -clouds. +%{common_desc} %package -n python3-%{pypi_name}-tests Summary: An SDK for building applications to work with OpenStack - test files @@ -116,8 +172,7 @@ Summary: An SDK for building applications to work with OpenStack - test f Requires: python3-%{pypi_name} = %{version}-%{release} %description -n python3-%{pypi_name}-tests -A collection of libraries for building applications to work with OpenStack -clouds - test files +%{common_desc_tests} %endif @@ -132,7 +187,9 @@ clouds - documentation. %endif %prep -%autosetup -n %{name}-%{upstream_version} -S git +%autosetup -n %{pypi_name}-%{upstream_version} -S git +# Let RPM handle the requirements +rm -rf {,test-}requirements.txt %build export PBR_VERSION=%{version} @@ -152,32 +209,37 @@ rm -rf html/.{doctrees,buildinfo} %install export PBR_VERSION=%{version} -%py2_install -mkdir -p $RPM_BUILD_ROOT/wheels -install -m 644 dist/*.whl $RPM_BUILD_ROOT/wheels/ - %if 0%{?with_python3} %{py3_install} %endif +%py2_install -# prep SDK package +# STX: stage wheels +mkdir -p $RPM_BUILD_ROOT/wheels +install -m 644 dist/*.whl $RPM_BUILD_ROOT/wheels/ + +# STX: prep SDK package mkdir -p %{buildroot}/usr/share/remote-clients -tar zcf %{buildroot}/usr/share/remote-clients/%{name}-%{version}.tgz --exclude='.gitignore' --exclude='.gitreview' -C .. %{name}-%{version} +tar zcf %{buildroot}/usr/share/remote-clients/%{pypi_name}-%{version}.tgz --exclude='.gitignore' --exclude='.gitreview' -C .. %{pypi_name}-%{version} %check -export PBR_VERSION=%{version} -%{__python2} setup.py test +%if 0%{?do_check} +export OS_STDOUT_CAPTURE=true +export OS_STDERR_CAPTURE=true +export OS_TEST_TIMEOUT=10 +stestr --test-path ./openstack/tests/unit run %if 0%{?with_python3} rm -rf .testrepository -export PBR_VERSION=%{version} -%{__python3} setup.py test +stestr-3 --test-path ./openstack/tests/unit run +%endif %endif %files -n python2-%{pypi_name} %doc README.rst %license LICENSE +%{_bindir}/openstack-inventory %{python2_sitelib}/openstack %{python2_sitelib}/%{pypi_name}-*.egg-info %exclude %{python2_sitelib}/openstack/tests @@ -203,8 +265,14 @@ export PBR_VERSION=%{version} %{python3_sitelib}/openstack/tests %endif +%package sdk +Summary: SDK files for %{name} + +%description sdk +Contains SDK files for %{name} package + %files sdk -/usr/share/remote-clients/%{name}-%{version}.tgz +/usr/share/remote-clients/%{pypi_name}-%{version}.tgz %package wheels Summary: %{name} wheels @@ -215,6 +283,9 @@ Contains python wheels for %{name} %files wheels /wheels/* + %changelog -* Mon Sep 12 2016 Haikel Guemar 0.9.5-1 -- Update to 0.9.5 +* Thu Aug 09 2018 RDO 0.17.2-1 +- Update to 0.17.2 + + diff --git a/openstack/python-openstacksdk/centos/python-openstacksdk.spec.orig b/openstack/python-openstacksdk/centos/python-openstacksdk.spec.orig new file mode 100644 index 00000000..6df8f208 --- /dev/null +++ b/openstack/python-openstacksdk/centos/python-openstacksdk.spec.orig @@ -0,0 +1,254 @@ +%{!?upstream_version: %global upstream_version %{version}%{?milestone}} +%if 0%{?fedora} >= 24 +%global with_python3 1 +%endif + +# Disable docs until bs4 package is available +%global with_doc 0 + +%global pypi_name openstacksdk + +%global common_desc \ +A collection of libraries for building applications to work with OpenStack \ +clouds. + +%global common_desc_tests \ +A collection of libraries for building applications to work with OpenStack \ +clouds - test files + +Name: python-%{pypi_name} +Version: 0.17.2 +Release: 1%{?dist} +Summary: An SDK for building applications to work with OpenStack + +License: ASL 2.0 +URL: http://www.openstack.org/ +Source0: https://pypi.io/packages/source/o/%{pypi_name}/%{pypi_name}-%{upstream_version}.tar.gz +BuildArch: noarch + +BuildRequires: git + +%description +%{common_desc} + +%package -n python2-%{pypi_name} +Summary: An SDK for building applications to work with OpenStack +%{?python_provide:%python_provide python2-%{pypi_name}} + +BuildRequires: python2-devel +BuildRequires: python2-pbr >= 2.0.0 +BuildRequires: python2-sphinx +BuildRequires: python2-openstackdocstheme +BuildRequires: python2-keystoneauth1 +BuildRequires: python2-appdirs +BuildRequires: python2-requestsexceptions +BuildRequires: python2-munch +BuildRequires: python2-jmespath +BuildRequires: python2-futures +BuildRequires: python2-jsonschema +BuildRequires: python2-os-service-types +# Test requirements +BuildRequires: python2-deprecation +BuildRequires: python2-iso8601 >= 0.1.11 +BuildRequires: python2-jsonpatch >= 1.6 +BuildRequires: python2-subunit +BuildRequires: python2-oslotest +BuildRequires: python2-stestr +BuildRequires: python2-mock +BuildRequires: python2-testrepository +BuildRequires: python2-testscenarios +BuildRequires: python2-testtools +BuildRequires: python2-glanceclient +%if 0%{?fedora} || 0%{?rhel} > 7 +BuildRequires: python2-requests-mock +BuildRequires: python2-decorator +BuildRequires: python2-dogpile-cache +BuildRequires: python2-ipaddress +BuildRequires: python2-netifaces +%else +BuildRequires: python-requests-mock +BuildRequires: python-decorator +BuildRequires: python-dogpile-cache +BuildRequires: python-ipaddress +BuildRequires: python-netifaces +%endif + +Requires: python2-deprecation +Requires: python2-jsonpatch >= 1.16 +Requires: python2-keystoneauth1 >= 3.8.0 +Requires: python2-six +Requires: python2-pbr >= 2.0.0 +Requires: python2-appdirs +Requires: python2-requestsexceptions >= 1.2.0 +Requires: python2-munch +Requires: python2-jmespath +Requires: python2-futures +Requires: python2-iso8601 +Requires: python2-os-service-types >= 1.2.0 +%if 0%{?fedora} || 0%{?rhel} > 7 +Requires: python2-decorator +Requires: python2-dogpile-cache +Requires: python2-ipaddress +Requires: python2-netifaces +Requires: python2-pyyaml +%else +Requires: python-decorator +Requires: python-dogpile-cache +Requires: python-ipaddress +Requires: python-netifaces +Requires: PyYAML +%endif + +%description -n python2-%{pypi_name} +%{common_desc} + +%package -n python2-%{pypi_name}-tests +Summary: An SDK for building applications to work with OpenStack - test files + +Requires: python2-%{pypi_name} = %{version}-%{release} + +%description -n python2-%{pypi_name}-tests +%{common_desc_tests} + +%if 0%{?with_python3} +%package -n python3-%{pypi_name} +Summary: An SDK for building applications to work with OpenStack +%{?python_provide:%python_provide python3-%{pypi_name}} + +BuildRequires: python3-devel +BuildRequires: python3-pbr >= 2.0.0 +BuildRequires: python3-keystoneauth1 +BuildRequires: python3-dogpile-cache +BuildRequires: python3-appdirs +BuildRequires: python3-requestsexceptions +BuildRequires: python3-munch +BuildRequires: python3-decorator +BuildRequires: python3-jmespath +BuildRequires: python3-netifaces +BuildRequires: python3-jsonschema +BuildRequires: python3-os-service-types +# Test requirements +BuildRequires: python3-deprecation +BuildRequires: python3-iso8601 >= 0.1.11 +BuildRequires: python3-jsonpatch >= 1.6 +BuildRequires: python3-subunit +BuildRequires: python3-oslotest +BuildRequires: python3-stestr +BuildRequires: python3-mock +BuildRequires: python3-requests-mock +BuildRequires: python3-testrepository +BuildRequires: python3-testscenarios +BuildRequires: python3-testtools +BuildRequires: python3-glanceclient + +Requires: python3-deprecation +Requires: python3-jsonpatch >= 1.16 +Requires: python3-keystoneauth1 >= 3.8.0 +Requires: python3-six +Requires: python3-pbr >= 2.0.0 +Requires: python3-PyYAML +Requires: python3-appdirs +Requires: python3-requestsexceptions >= 1.2.0 +Requires: python3-dogpile-cache +Requires: python3-munch +Requires: python3-decorator +Requires: python3-jmespath +Requires: python3-netifaces +Requires: python3-jsonschema +Requires: python3-iso8601 +Requires: python3-os-service-types >= 1.2.0 + +%description -n python3-%{pypi_name} +%{common_desc} + +%package -n python3-%{pypi_name}-tests +Summary: An SDK for building applications to work with OpenStack - test files + +Requires: python3-%{pypi_name} = %{version}-%{release} + +%description -n python3-%{pypi_name}-tests +%{common_desc_tests} + +%endif + + +%if 0%{?with_doc} +%package -n python-%{pypi_name}-doc +Summary: An SDK for building applications to work with OpenStack - documentation + +%description -n python-%{pypi_name}-doc +A collection of libraries for building applications to work with OpenStack +clouds - documentation. +%endif + +%prep +%autosetup -n %{pypi_name}-%{upstream_version} -S git +# Let RPM handle the requirements +rm -rf {,test-}requirements.txt + +%build +%py2_build + +%if 0%{?with_python3} +%{py3_build} +%endif + +%if 0%{?with_doc} +# generate html docs +sphinx-build -b html doc/source html +# remove the sphinx-build leftovers +rm -rf html/.{doctrees,buildinfo} +%endif + +%install +%if 0%{?with_python3} +%{py3_install} +%endif +%py2_install + +%check +export OS_STDOUT_CAPTURE=true +export OS_STDERR_CAPTURE=true +export OS_TEST_TIMEOUT=10 +stestr --test-path ./openstack/tests/unit run + +%if 0%{?with_python3} +rm -rf .testrepository +stestr-3 --test-path ./openstack/tests/unit run +%endif + + +%files -n python2-%{pypi_name} +%doc README.rst +%license LICENSE +%{_bindir}/openstack-inventory +%{python2_sitelib}/openstack +%{python2_sitelib}/%{pypi_name}-*.egg-info +%exclude %{python2_sitelib}/openstack/tests + +%files -n python2-%{pypi_name}-tests +%{python2_sitelib}/openstack/tests + +%if 0%{?with_doc} +%files -n python-%{pypi_name}-doc +%doc html +%license LICENSE +%endif + +%if 0%{?with_python3} +%files -n python3-%{pypi_name} +%doc README.rst +%license LICENSE +%{python3_sitelib}/openstack +%{python3_sitelib}/%{pypi_name}-*.egg-info +%exclude %{python3_sitelib}/openstack/tests + +%files -n python3-%{pypi_name}-tests +%{python3_sitelib}/openstack/tests +%endif + +%changelog +* Thu Aug 09 2018 RDO 0.17.2-1 +- Update to 0.17.2 + + diff --git a/openstack/python-pankoclient/centos/build_srpm.data b/openstack/python-pankoclient/centos/build_srpm.data new file mode 100644 index 00000000..8bc4cc31 --- /dev/null +++ b/openstack/python-pankoclient/centos/build_srpm.data @@ -0,0 +1,3 @@ +TAR_NAME=pankoclient +SRC_DIR=$CGCS_BASE/git/python-pankoclient +TIS_PATCH_VER=0 diff --git a/openstack/python-pankoclient/centos/python-pankoclient.spec b/openstack/python-pankoclient/centos/python-pankoclient.spec new file mode 100644 index 00000000..7bd53d85 --- /dev/null +++ b/openstack/python-pankoclient/centos/python-pankoclient.spec @@ -0,0 +1,237 @@ +%{!?python2_shortver: %global python2_shortver %(%{__python2} -c 'import sys; print(str(sys.version_info.major) + "." + str(sys.version_info.minor))')} +%{!?python3_shortver: %global python3_shortver %(%{__python3} -c 'import sys; print(str(sys.version_info.major) + "." + str(sys.version_info.minor))')} + +%global pypi_name pankoclient + +%{!?upstream_version: %global upstream_version %{version}%{?milestone}} + +%if 0%{?fedora} >= 24 +%global with_python3 1 +%endif + +Name: python-pankoclient +Version: 0.5.0 +Release: 1%{?_tis_dist}.%{tis_patch_ver} +Summary: Python API and CLI for OpenStack Panko + +License: ASL 2.0 +URL: https://github.com/openstack/%{name} +Source0: https://tarballs.openstack.org/%{name}/%{pypi_name}-%{upstream_version}.tar.gz + +BuildArch: noarch + + +%package -n python2-%{pypi_name} +Summary: Python API and CLI for OpenStack Panko +%{?python_provide:%python_provide python2-%{pypi_name}} + + +BuildRequires: git +BuildRequires: python-setuptools +BuildRequires: python2-pip +BuildRequires: python2-wheel +BuildRequires: python2-devel +BuildRequires: python-pbr +BuildRequires: python-tools + +Requires: python-keystoneauth1 >= 2.18.0 +Requires: python-osc-lib >= 1.2.0 +Requires: python-oslo-i18n >= 2.1.0 +Requires: python-oslo-serialization >= 1.10.0 +Requires: python-oslo-utils >= 3.18.0 +Requires: python-pbr +Requires: python-requests +Requires: python-six >= 1.9.0 + + +%description -n python2-%{pypi_name} +This is a client library for Panko built on the Panko API. It +provides a Python API (the pankoclient module) and a command-line tool. + + +%package -n python-%{pypi_name}-doc +Summary: Documentation for OpenStack Panko API Client +Group: Documentation + +BuildRequires: python-sphinx +BuildRequires: python-openstackdocstheme +# FIXME: remove following line when a new release including https://review.openstack.org/#/c/476760/ is in u-c +BuildRequires: python-oslo-sphinx +BuildRequires: python-openstack-doc-tools +BuildRequires: python-osc-lib +# test +BuildRequires: python-babel + +%description doc +This is a client library for Panko built on the Panko API. It +provides a Python API (the pankoclient module) and a command-line tool +(panko). + +This package contains auto-generated documentation. + +%package -n python2-%{pypi_name}-tests +Summary: Python API and CLI for OpenStack Panko Tests +Requires: python-%{pypi_name} = %{version}-%{release} + +%description -n python2-%{pypi_name}-tests +This is a client library for Panko built on the Panko API. It +provides a Python API (the pankoclient module) and a command-line tool. + +%if 0%{?with_python3} +%package -n python3-%{pypi_name} +Summary: Python API and CLI for OpenStack Panko + +%{?python_provide:%python_provide python3-%{pypi_name}} + +BuildRequires: python3-devel +BuildRequires: python3-pbr +BuildRequires: python3-setuptools +BuildRequires: python3-tools + +Requires: python3-keystoneauth1 >= 2.18.0 +Requires: python3-osc-lib >= 1.2.0 +Requires: python3-oslo-i18n >= 2.1.0 +Requires: python3-oslo-serialization >= 1.10.0 +Requires: python3-oslo-utils >= 3.18.0 +Requires: python3-pbr +Requires: python3-requests +Requires: python3-six >= 1.9.0 + +%description -n python3-%{pypi_name} +This is a client library for Panko built on the Panko API. It +provides a Python API (the pankoclient module) and a command-line tool. + +%package -n python3-%{pypi_name}-tests +Summary: Python API and CLI for OpenStack Panko Tests +Requires: python3-%{pypi_name} = %{version}-%{release} + +%description -n python3-%{pypi_name}-tests +This is a client library for Panko built on the Panko API. It +provides a Python API (the pankoclient module) and a command-line tool. + +%endif + +%description +This is a client library for Panko built on the Panko API. It +provides a Python API (the pankoclient module) and a command-line tool. + + +%prep +%autosetup -n %{pypi_name}-%{upstream_version} -S git + +%if 0%{?with_python3} +rm -rf %{py3dir} +cp -a . %{py3dir} +2to3 --write --nobackups %{py3dir} +%endif + +# Remove bundled egg-info +rm -rf pankoclient.egg-info + +# Let RPM handle the requirements +rm -f {,test-}requirements.txt + +%build +export PBR_VERSION=%{version} +%py2_build +%py2_build_wheel +%if 0%{?with_python3} +pushd %{py3dir} +LANG=en_US.UTF-8 %{__python3} setup.py build +popd +%endif + + +%install +export PBR_VERSION=%{version} +%if 0%{?with_python3} +pushd %{py3dir} +LANG=en_US.UTF-8 %{__python3} setup.py install --skip-build --root %{buildroot} +popd +mv %{buildroot}%{_bindir}/panko %{buildroot}%{_bindir}/panko-%{python3_version} +ln -s ./panko-%{python3_version} %{buildroot}%{_bindir}/panko-3 +%endif + +%{__python2} setup.py install --skip-build --root %{buildroot} +mv %{buildroot}%{_bindir}/panko %{buildroot}%{_bindir}/panko-%{python2_version} +ln -s %{_bindir}/panko-%{python2_version} %{buildroot}%{_bindir}/panko-2 +ln -s %{_bindir}/panko-2 %{buildroot}%{_bindir}/panko + +# Some env variables required to successfully build our doc +export PATH=$PATH:%{buildroot}%{_bindir} +export LANG=en_US.utf8 +%{__python2} setup.py build_sphinx -b html + +# Fix hidden-file-or-dir warnings +rm -rf doc/build/html/.doctrees doc/build/html/.buildinfo + +# STX: stage wheels +mkdir -p $RPM_BUILD_ROOT/wheels +install -m 644 dist/*.whl $RPM_BUILD_ROOT/wheels/ + +# STX: prep SDK package +mkdir -p %{buildroot}/usr/share/remote-clients +tar zcf %{buildroot}/usr/share/remote-clients/%{pypi_name}-%{version}.tgz --exclude='.gitignore' --exclude='.gitreview' -C .. %{pypi_name}-%{version} + + +%files -n python2-%{pypi_name} +%doc README.rst +%license LICENSE +%{_bindir}/panko +%{_bindir}/panko-2 +%{_bindir}/panko-%{python2_version} +# XXX: man page build is broken +#%{_mandir}/man1/panko.1* +%{python2_sitelib}/pankoclient +%{python2_sitelib}/*.egg-info +%exclude %{python2_sitelib}/pankoclient/tests + +%files -n python2-%{pypi_name}-tests +%license LICENSE +%{python2_sitelib}/pankoclient/tests + + +%if 0%{?with_python3} +%files -n python3-%{pypi_name} +%doc README.rst +%license LICENSE +%{_bindir}/panko-3 +%{_bindir}/panko-%{python3_version} +%{python3_sitelib}/pankoclient +%{python3_sitelib}/*.egg-info +%exclude %{python3_sitelib}/pankoclient/tests + +%files -n python3-%{pypi_name}-tests +%license LICENSE +%{python3_sitelib}/pankoclient/tests + +%endif + +%files -n python-%{pypi_name}-doc +%doc doc/build/html +%license LICENSE + +%package sdk +Summary: SDK files for %{pypi_name} + +%description sdk +Contains SDK files for %{pypi_name} package + +%files sdk +/usr/share/remote-clients/%{pypi_name}-%{version}.tgz + +%package wheels +Summary: %{name} wheels + +%description wheels +Contains python wheels for %{name} + +%files wheels +/wheels/* + + +%changelog +* Wed Aug 22 2018 RDO 0.5.0-1 +- Update to 0.5.0 + + diff --git a/openstack/python-pankoclient/centos/python-pankoclient.spec.orig b/openstack/python-pankoclient/centos/python-pankoclient.spec.orig new file mode 100644 index 00000000..d6ff9220 --- /dev/null +++ b/openstack/python-pankoclient/centos/python-pankoclient.spec.orig @@ -0,0 +1,204 @@ +%{!?python2_shortver: %global python2_shortver %(%{__python2} -c 'import sys; print(str(sys.version_info.major) + "." + str(sys.version_info.minor))')} +%{!?python3_shortver: %global python3_shortver %(%{__python3} -c 'import sys; print(str(sys.version_info.major) + "." + str(sys.version_info.minor))')} + +%global pypi_name pankoclient + +%{!?upstream_version: %global upstream_version %{version}%{?milestone}} + +%if 0%{?fedora} >= 24 +%global with_python3 1 +%endif + +Name: python-pankoclient +Version: 0.5.0 +Release: 1%{?dist} +Summary: Python API and CLI for OpenStack Panko + +License: ASL 2.0 +URL: https://github.com/openstack/%{name} +Source0: https://tarballs.openstack.org/%{name}/%{pypi_name}-%{upstream_version}.tar.gz + +BuildArch: noarch + + +%package -n python2-%{pypi_name} +Summary: Python API and CLI for OpenStack Panko +%{?python_provide:%python_provide python2-%{pypi_name}} + + +BuildRequires: git +BuildRequires: python-setuptools +BuildRequires: python2-devel +BuildRequires: python-pbr +BuildRequires: python-tools + +Requires: python-keystoneauth1 >= 2.18.0 +Requires: python-osc-lib >= 1.2.0 +Requires: python-oslo-i18n >= 2.1.0 +Requires: python-oslo-serialization >= 1.10.0 +Requires: python-oslo-utils >= 3.18.0 +Requires: python-pbr +Requires: python-requests +Requires: python-six >= 1.9.0 + + +%description -n python2-%{pypi_name} +This is a client library for Panko built on the Panko API. It +provides a Python API (the pankoclient module) and a command-line tool. + + +%package -n python-%{pypi_name}-doc +Summary: Documentation for OpenStack Panko API Client +Group: Documentation + +BuildRequires: python-sphinx +BuildRequires: python-openstackdocstheme +# FIXME: remove following line when a new release including https://review.openstack.org/#/c/476760/ is in u-c +BuildRequires: python-oslo-sphinx +BuildRequires: python-openstack-doc-tools +BuildRequires: python-osc-lib +# test +BuildRequires: python-babel + +%description doc +This is a client library for Panko built on the Panko API. It +provides a Python API (the pankoclient module) and a command-line tool +(panko). + +This package contains auto-generated documentation. + +%package -n python2-%{pypi_name}-tests +Summary: Python API and CLI for OpenStack Panko Tests +Requires: python-%{pypi_name} = %{version}-%{release} + +%description -n python2-%{pypi_name}-tests +This is a client library for Panko built on the Panko API. It +provides a Python API (the pankoclient module) and a command-line tool. + +%if 0%{?with_python3} +%package -n python3-%{pypi_name} +Summary: Python API and CLI for OpenStack Panko + +%{?python_provide:%python_provide python3-%{pypi_name}} + +BuildRequires: python3-devel +BuildRequires: python3-pbr +BuildRequires: python3-setuptools +BuildRequires: python3-tools + +Requires: python3-keystoneauth1 >= 2.18.0 +Requires: python3-osc-lib >= 1.2.0 +Requires: python3-oslo-i18n >= 2.1.0 +Requires: python3-oslo-serialization >= 1.10.0 +Requires: python3-oslo-utils >= 3.18.0 +Requires: python3-pbr +Requires: python3-requests +Requires: python3-six >= 1.9.0 + +%description -n python3-%{pypi_name} +This is a client library for Panko built on the Panko API. It +provides a Python API (the pankoclient module) and a command-line tool. + +%package -n python3-%{pypi_name}-tests +Summary: Python API and CLI for OpenStack Panko Tests +Requires: python3-%{pypi_name} = %{version}-%{release} + +%description -n python3-%{pypi_name}-tests +This is a client library for Panko built on the Panko API. It +provides a Python API (the pankoclient module) and a command-line tool. + +%endif + +%description +This is a client library for Panko built on the Panko API. It +provides a Python API (the pankoclient module) and a command-line tool. + + +%prep +%autosetup -n %{pypi_name}-%{upstream_version} -S git + +%if 0%{?with_python3} +rm -rf %{py3dir} +cp -a . %{py3dir} +2to3 --write --nobackups %{py3dir} +%endif + +# Remove bundled egg-info +rm -rf pankoclient.egg-info + +# Let RPM handle the requirements +rm -f {,test-}requirements.txt + +%build +%py2_build +%if 0%{?with_python3} +pushd %{py3dir} +LANG=en_US.UTF-8 %{__python3} setup.py build +popd +%endif + + +%install +%if 0%{?with_python3} +pushd %{py3dir} +LANG=en_US.UTF-8 %{__python3} setup.py install --skip-build --root %{buildroot} +popd +mv %{buildroot}%{_bindir}/panko %{buildroot}%{_bindir}/panko-%{python3_version} +ln -s ./panko-%{python3_version} %{buildroot}%{_bindir}/panko-3 +%endif + +%{__python2} setup.py install --skip-build --root %{buildroot} +mv %{buildroot}%{_bindir}/panko %{buildroot}%{_bindir}/panko-%{python2_version} +ln -s %{_bindir}/panko-%{python2_version} %{buildroot}%{_bindir}/panko-2 +ln -s %{_bindir}/panko-2 %{buildroot}%{_bindir}/panko + +# Some env variables required to successfully build our doc +export PATH=$PATH:%{buildroot}%{_bindir} +export LANG=en_US.utf8 +%{__python2} setup.py build_sphinx -b html + +# Fix hidden-file-or-dir warnings +rm -rf doc/build/html/.doctrees doc/build/html/.buildinfo + +%files -n python2-%{pypi_name} +%doc README.rst +%license LICENSE +%{_bindir}/panko +%{_bindir}/panko-2 +%{_bindir}/panko-%{python2_version} +# XXX: man page build is broken +#%{_mandir}/man1/panko.1* +%{python2_sitelib}/pankoclient +%{python2_sitelib}/*.egg-info +%exclude %{python2_sitelib}/pankoclient/tests + +%files -n python2-%{pypi_name}-tests +%license LICENSE +%{python2_sitelib}/pankoclient/tests + + +%if 0%{?with_python3} +%files -n python3-%{pypi_name} +%doc README.rst +%license LICENSE +%{_bindir}/panko-3 +%{_bindir}/panko-%{python3_version} +%{python3_sitelib}/pankoclient +%{python3_sitelib}/*.egg-info +%exclude %{python3_sitelib}/pankoclient/tests + +%files -n python3-%{pypi_name}-tests +%license LICENSE +%{python3_sitelib}/pankoclient/tests + +%endif + +%files -n python-%{pypi_name}-doc +%doc doc/build/html +%license LICENSE + +%changelog +* Wed Aug 22 2018 RDO 0.5.0-1 +- Update to 0.5.0 + +