[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#863948: marked as done (unblock: magnum/3.1.1-5)



Your message dated Sat, 03 Jun 2017 18:27:21 +0000
with message-id <E1dHDlh-0002xd-R7@respighi.debian.org>
and subject line unblock magnum
has caused the Debian Bug report #863948,
regarding unblock: magnum/3.1.1-5
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact owner@bugs.debian.org
immediately.)


-- 
863948: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=863948
Debian Bug Tracking System
Contact owner@bugs.debian.org with problems
--- Begin Message ---
Package: release.debian.org
Severity: normal
User: release.debian.org@packages.debian.org
Usertags: unblock

Please unblock package magnum 3.1.1-5.

This version fix CVE-2016-7404 (#863547).
Debdiff attached.

Thanks.

unblock magnum/3.1.1-5

-- System Information:
Debian Release: 9.0
  APT prefers unstable
  APT policy: (500, 'unstable'), (500, 'testing'), (500, 'stable'), (1, 'experimental')
Architecture: amd64
 (x86_64)

Kernel: Linux 4.9.0-3-amd64 (SMP w/2 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)
diff -Nru magnum-3.1.1/debian/changelog magnum-3.1.1/debian/changelog
--- magnum-3.1.1/debian/changelog	2017-04-04 17:31:50.000000000 +0200
+++ magnum-3.1.1/debian/changelog	2017-06-01 16:31:39.000000000 +0200
@@ -1,3 +1,10 @@
+magnum (3.1.1-5) unstable; urgency=medium
+
+  * Team upload.
+  * Fix CVE-2016-7404 (Closes: #863547)
+
+ -- Ondřej Nový <onovy@debian.org>  Thu, 01 Jun 2017 16:31:39 +0200
+
 magnum (3.1.1-4) unstable; urgency=medium
 
   * Brazilian Portuguese debconf templates (Closes: #852444).
diff -Nru magnum-3.1.1/debian/patches/CVE-2016-7404.patch magnum-3.1.1/debian/patches/CVE-2016-7404.patch
--- magnum-3.1.1/debian/patches/CVE-2016-7404.patch	1970-01-01 01:00:00.000000000 +0100
+++ magnum-3.1.1/debian/patches/CVE-2016-7404.patch	2017-06-01 16:31:39.000000000 +0200
@@ -0,0 +1,743 @@
+From 2d4e617a529ea12ab5330f12631f44172a623a14 Mon Sep 17 00:00:00 2001
+From: Johannes Grassler <johannes.grassler@suse.com>
+Date: Fri, 16 Sep 2016 10:01:07 +0200
+Subject: [PATCH] Fix CVE-2016-7404
+
+This commit addresses multiple potential vulnerabilities in
+Magnum. It makes the following changes:
+
+* Permissions for /etc/sysconfig/heat-params inside Magnum
+  created instances are tightened to 0600 (used to be 0755).
+* Certificate retrieval is modified to work without the need
+  for a Keystone trust.
+* The cluster's Keystone trust id is only passed into
+  instances for clusters where that is actually needed. This
+  prevents the trustee user from consuming the trust in cases
+  where it is not needed.
+* The configuration setting trust/cluster_user_trust (False by
+  default) is introduced. It needs to be explicitely enabled
+  by the cloud operator to allow clusters that need the
+  trust_id to be passed into instances to work. Without this
+  setting, attempts to create such clusters will fail.
+
+Please note, that none of these changes apply to existing
+clusters. They will have to be deleted and rebuilt to benefit
+from these changes.
+
+(cherry picked from commit e93d82e8b3bc19211efd54edc17aebdca50670c1)
+
+Changes for backport:
+
+* Moved cluster_user_trust setting to magnum/common/keystone.py
+* Resolved merge conflicts.
+* Fixed unit tests with configuration overrides.
+
+Change-Id: I408d845ee4fd00d5bcd1e90f0a78f2bba3f2a57a
+---
+ devstack/lib/magnum                                |  1 +
+ etc/magnum/policy.json                             | 54 +++++++++++-----------
+ magnum/common/keystone.py                          | 12 +++++
+ magnum/common/policy.py                            | 12 +++++
+ magnum/conductor/handlers/common/trust_manager.py  | 13 ++++--
+ magnum/db/sqlalchemy/api.py                        | 17 ++++++-
+ magnum/drivers/common/template_def.py              | 16 ++++++-
+ .../kubernetes/fragments/make-cert-client.sh       |  5 --
+ .../templates/kubernetes/fragments/make-cert.sh    |  5 --
+ .../fragments/write-heat-params-master.yaml        |  2 +-
+ .../kubernetes/fragments/write-heat-params.yaml    |  2 +-
+ .../templates/fragments/make-cert-client.yaml      |  5 --
+ .../templates/fragments/make-cert.yaml             |  5 --
+ .../fragments/write-heat-params-master.yaml        |  2 +-
+ .../templates/fragments/write-heat-params.yaml     |  2 +-
+ .../templates/fragments/write-heat-params.yaml     |  2 +-
+ .../templates/fragments/make-cert.py               |  6 ---
+ .../fragments/write-heat-params-master.yaml        |  2 +-
+ .../fragments/write-heat-params-node.yaml          |  2 +-
+ magnum/tests/base.py                               | 27 +++++++++++
+ magnum/tests/unit/common/test_keystone.py          | 15 ++++++
+ .../handlers/common/test_trust_manager.py          |  3 +-
+ .../conductor/handlers/test_cluster_conductor.py   |  5 ++
+ .../handlers/test_k8s_cluster_conductor.py         | 14 ++++--
+ .../handlers/test_mesos_cluster_conductor.py       |  9 ++--
+ .../handlers/test_swarm_cluster_conductor.py       |  8 +++-
+ 26 files changed, 171 insertions(+), 75 deletions(-)
+
+--- a/devstack/lib/magnum
++++ b/devstack/lib/magnum
+@@ -206,6 +206,7 @@
+               --os-identity-api-version 3 role add \
+               --user $trustee_domain_admin_id --domain $trustee_domain_id \
+               admin
++    iniset $MAGNUM_CONF trust cluster_user_trust True
+     iniset $MAGNUM_CONF trust trustee_domain_name magnum
+     iniset $MAGNUM_CONF trust trustee_domain_admin_name trustee_domain_admin
+     iniset $MAGNUM_CONF trust trustee_domain_admin_password $MAGNUM_TRUSTEE_DOMAIN_ADMIN_PASSWORD
+--- a/etc/magnum/policy.json
++++ b/etc/magnum/policy.json
+@@ -4,35 +4,37 @@
+     "default": "rule:admin_or_owner",
+     "admin_api": "rule:context_is_admin",
+     "admin_or_user": "is_admin:True or user_id:%(user_id)s",
++    "cluster_user": "user_id:%(trustee_user_id)s",
++    "deny_cluster_user": "not domain_id:%(trustee_domain_id)s",
+ 
+-    "bay:create": "rule:default",
+-    "bay:delete": "rule:default",
+-    "bay:detail": "rule:default",
+-    "bay:get": "rule:default",
+-    "bay:get_all": "rule:default",
+-    "bay:update": "rule:default",
+-
+-    "baymodel:create": "rule:default",
+-    "baymodel:delete": "rule:default",
+-    "baymodel:detail": "rule:default",
+-    "baymodel:get": "rule:default",
+-    "baymodel:get_all": "rule:default",
+-    "baymodel:update": "rule:default",
++    "bay:create": "rule:deny_cluster_user",
++    "bay:delete": "rule:deny_cluster_user",
++    "bay:detail": "rule:deny_cluster_user",
++    "bay:get": "rule:deny_cluster_user",
++    "bay:get_all": "rule:deny_cluster_user",
++    "bay:update": "rule:deny_cluster_user",
++
++    "baymodel:create": "rule:deny_cluster_user",
++    "baymodel:delete": "rule:deny_cluster_user",
++    "baymodel:detail": "rule:deny_cluster_user",
++    "baymodel:get": "rule:deny_cluster_user",
++    "baymodel:get_all": "rule:deny_cluster_user",
++    "baymodel:update": "rule:deny_cluster_user",
+     "baymodel:publish": "rule:admin_or_owner",
+ 
+-    "cluster:create": "rule:default",
+-    "cluster:delete": "rule:default",
+-    "cluster:detail": "rule:default",
+-    "cluster:get": "rule:default",
+-    "cluster:get_all": "rule:default",
+-    "cluster:update": "rule:default",
+-
+-    "clustertemplate:create": "rule:default",
+-    "clustertemplate:delete": "rule:default",
+-    "clustertemplate:detail": "rule:default",
+-    "clustertemplate:get": "rule:default",
+-    "clustertemplate:get_all": "rule:default",
+-    "clustertemplate:update": "rule:default",
++    "cluster:create": "rule:deny_cluster_user",
++    "cluster:delete": "rule:deny_cluster_user",
++    "cluster:detail": "rule:deny_cluster_user",
++    "cluster:get": "rule:deny_cluster_user",
++    "cluster:get_all": "rule:deny_cluster_user",
++    "cluster:update": "rule:deny_cluster_user",
++
++    "clustertemplate:create": "rule:deny_cluster_user",
++    "clustertemplate:delete": "rule:deny_cluster_user",
++    "clustertemplate:detail": "rule:deny_cluster_user",
++    "clustertemplate:get": "rule:deny_cluster_user",
++    "clustertemplate:get_all": "rule:deny_cluster_user",
++    "clustertemplate:update": "rule:deny_cluster_user",
+     "clustertemplate:publish": "rule:admin_or_owner",
+ 
+     "rc:create": "rule:default",
+@@ -42,8 +44,8 @@
+     "rc:get_all": "rule:default",
+     "rc:update": "rule:default",
+ 
+-    "certificate:create": "rule:admin_or_user",
+-    "certificate:get": "rule:admin_or_user",
++    "certificate:create": "rule:admin_or_user or rule:cluster_user",
++    "certificate:get": "rule:admin_or_user or rule:cluster_user",
+ 
+     "magnum-service:get_all": "rule:admin_api"
+ }
+--- a/magnum/common/keystone.py
++++ b/magnum/common/keystone.py
+@@ -31,6 +31,17 @@
+ LOG = logging.getLogger(__name__)
+ 
+ trust_opts = [
++    cfg.BoolOpt('cluster_user_trust',
++                default=False,
++                help=_('This setting controls whether to assign a trust to'
++                       ' the cluster user or not. You will need to set it to'
++                       ' True for clusters with volume_driver=cinder or'
++                       ' registry_enabled=true in the underlying cluster'
++                       ' template to work. This is a potential security risk'
++                       ' since the trust gives instances OpenStack API access'
++                       " to the cluster's project. Note that this setting"
++                       ' does not affect per-cluster trusts assigned to the'
++                       'Magnum service user.')),
+     cfg.StrOpt('trustee_domain_id',
+                help=_('Id of the domain to create trustee for clusters')),
+     cfg.StrOpt('trustee_domain_name',
+@@ -249,6 +260,7 @@
+                 project=trustor_project_id,
+                 trustee_user=trustee_user,
+                 impersonation=True,
++                delegation_depth=0,
+                 role_names=roles)
+         except Exception:
+             LOG.exception(_LE('Failed to create trust'))
+--- a/magnum/common/policy.py
++++ b/magnum/common/policy.py
+@@ -20,6 +20,8 @@
+ from oslo_policy import policy
+ import pecan
+ 
++from magnum.common import clients
++from magnum.common import context
+ from magnum.common import exception
+ 
+ 
+@@ -92,10 +94,20 @@
+     if target is None:
+         target = {'project_id': context.project_id,
+                   'user_id': context.user_id}
++    add_policy_attributes(target)
+     return enforcer.enforce(rule, target, credentials,
+                             do_raise=do_raise, exc=exc, *args, **kwargs)
+ 
+ 
++def add_policy_attributes(target):
++    """Adds extra information for policy enforcement to raw target object"""
++    admin_context = context.make_admin_context()
++    admin_osc = clients.OpenStackClients(admin_context)
++    trustee_domain_id = admin_osc.keystone().trustee_domain_id
++    target['trustee_domain_id'] = trustee_domain_id
++    return target
++
++
+ def enforce_wsgi(api_name, act=None):
+     """This is a decorator to simplify wsgi action policy rule check.
+ 
+--- a/magnum/conductor/handlers/common/trust_manager.py
++++ b/magnum/conductor/handlers/common/trust_manager.py
+@@ -22,15 +22,20 @@
+ def create_trustee_and_trust(osc, cluster):
+     try:
+         password = utils.generate_password(length=18)
++
+         trustee = osc.keystone().create_trustee(
+-            cluster.uuid,
++            "%s_%s" % (cluster.uuid, cluster.project_id),
+             password,
+         )
++
+         cluster.trustee_username = trustee.name
+         cluster.trustee_user_id = trustee.id
+         cluster.trustee_password = password
+-        trust = osc.keystone().create_trust(trustee.id)
++
++        trust = osc.keystone().create_trust(
++            cluster.trustee_user_id)
+         cluster.trust_id = trust.id
++
+     except Exception:
+         LOG.exception(
+             _LE('Failed to create trustee and trust for Cluster: %s'),
+@@ -41,9 +46,11 @@
+ 
+ def delete_trustee_and_trust(osc, context, cluster):
+     try:
++        kst = osc.keystone()
++
+         # The cluster which is upgraded from Liberty doesn't have trust_id
+         if cluster.trust_id:
+-            osc.keystone().delete_trust(context, cluster)
++            kst.delete_trust(context, cluster)
+     except Exception:
+         # Exceptions are already logged by keystone().delete_trust
+         pass
+--- a/magnum/db/sqlalchemy/api.py
++++ b/magnum/db/sqlalchemy/api.py
+@@ -24,6 +24,8 @@
+ from sqlalchemy.orm.exc import MultipleResultsFound
+ from sqlalchemy.orm.exc import NoResultFound
+ 
++from magnum.common import clients
++from magnum.common import context as request_context
+ from magnum.common import exception
+ from magnum.db import api
+ from magnum.db.sqlalchemy import models
+@@ -113,8 +115,21 @@
+         if context.is_admin and context.all_tenants:
+             return query
+ 
+-        if context.project_id:
++        admin_context = request_context.make_admin_context(all_tenants=True)
++        osc = clients.OpenStackClients(admin_context)
++        kst = osc.keystone()
++
++        # User in a regular project (not in the trustee domain)
++        if context.project_id and context.domain_id != kst.trustee_domain_id:
+             query = query.filter_by(project_id=context.project_id)
++        # Match project ID component in trustee user's user name against
++        # cluster's project_id to associate per-cluster trustee users who have
++        # no project information with the project their clusters/cluster models
++        # reside in. This is equivalent to the project filtering above.
++        elif context.domain_id == kst.trustee_domain_id:
++            user_name = kst.client.users.get(context.user_id).name
++            user_project = user_name.split('_', 2)[1]
++            query = query.filter_by(project_id=user_project)
+         else:
+             query = query.filter_by(user_id=context.user_id)
+ 
+--- a/magnum/drivers/common/template_def.py
++++ b/magnum/drivers/common/template_def.py
+@@ -23,6 +23,7 @@
+ from magnum.common import clients
+ from magnum.common import exception
+ from magnum.i18n import _
++from magnum.i18n import _LE
+ from magnum.i18n import _LW
+ 
+ from requests import exceptions as req_exceptions
+@@ -380,7 +381,20 @@
+         extra_params['trustee_user_id'] = cluster.trustee_user_id
+         extra_params['trustee_username'] = cluster.trustee_username
+         extra_params['trustee_password'] = cluster.trustee_password
+-        extra_params['trust_id'] = cluster.trust_id
++
++        # Only pass trust ID into the template when it is needed.
++        if (cluster_template.volume_driver == 'rexray' or
++                cluster_template.registry_enabled):
++            if CONF.trust.cluster_user_trust:
++                extra_params['trust_id'] = cluster.trust_id
++            else:
++                missing_setting = ('trust/cluster_user_trust = True')
++                msg = _LE('This cluster can only be created with %s in '
++                          'magnum.conf')
++                raise exception.ConfigInvalid(msg % missing_setting)
++        else:
++            extra_params['trust_id'] = ""
++
+         extra_params['auth_url'] = context.auth_url
+ 
+         return super(BaseTemplateDefinition,
+--- a/magnum/drivers/common/templates/kubernetes/fragments/make-cert-client.sh
++++ b/magnum/drivers/common/templates/kubernetes/fragments/make-cert-client.sh
+@@ -49,11 +49,6 @@
+                     "password": "$TRUSTEE_PASSWORD"
+                 }
+             }
+-        },
+-        "scope": {
+-            "OS-TRUST:trust": {
+-                "id": "$TRUST_ID"
+-            }
+         }
+     }
+ }
+--- a/magnum/drivers/common/templates/kubernetes/fragments/make-cert.sh
++++ b/magnum/drivers/common/templates/kubernetes/fragments/make-cert.sh
+@@ -71,11 +71,6 @@
+                     "password": "$TRUSTEE_PASSWORD"
+                 }
+             }
+-        },
+-        "scope": {
+-            "OS-TRUST:trust": {
+-                "id": "$TRUST_ID"
+-            }
+         }
+     }
+ }
+--- a/magnum/drivers/common/templates/kubernetes/fragments/write-heat-params-master.yaml
++++ b/magnum/drivers/common/templates/kubernetes/fragments/write-heat-params-master.yaml
+@@ -3,7 +3,7 @@
+ write_files:
+   - path: /etc/sysconfig/heat-params
+     owner: "root:root"
+-    permissions: "0644"
++    permissions: "0600"
+     content: |
+       KUBE_API_PUBLIC_ADDRESS="$KUBE_API_PUBLIC_ADDRESS"
+       KUBE_API_PRIVATE_ADDRESS="$KUBE_API_PRIVATE_ADDRESS"
+--- a/magnum/drivers/common/templates/kubernetes/fragments/write-heat-params.yaml
++++ b/magnum/drivers/common/templates/kubernetes/fragments/write-heat-params.yaml
+@@ -3,7 +3,7 @@
+ write_files:
+   - path: /etc/sysconfig/heat-params
+     owner: "root:root"
+-    permissions: "0644"
++    permissions: "0600"
+     content: |
+       KUBE_ALLOW_PRIV="$KUBE_ALLOW_PRIV"
+       KUBE_MASTER_IP="$KUBE_MASTER_IP"
+--- a/magnum/drivers/k8s_coreos_v1/templates/fragments/make-cert-client.yaml
++++ b/magnum/drivers/k8s_coreos_v1/templates/fragments/make-cert-client.yaml
+@@ -66,11 +66,6 @@
+                           "password": "$TRUSTEE_PASSWORD"
+                       }
+                   }
+-              },
+-              "scope": {
+-                  "OS-TRUST:trust": {
+-                      "id": "$TRUST_ID"
+-                  }
+               }
+           }
+       }
+--- a/magnum/drivers/k8s_coreos_v1/templates/fragments/make-cert.yaml
++++ b/magnum/drivers/k8s_coreos_v1/templates/fragments/make-cert.yaml
+@@ -89,11 +89,6 @@
+                           "password": "$TRUSTEE_PASSWORD"
+                       }
+                   }
+-              },
+-              "scope": {
+-                  "OS-TRUST:trust": {
+-                      "id": "$TRUST_ID"
+-                  }
+               }
+           }
+       }
+--- a/magnum/drivers/k8s_coreos_v1/templates/fragments/write-heat-params-master.yaml
++++ b/magnum/drivers/k8s_coreos_v1/templates/fragments/write-heat-params-master.yaml
+@@ -3,7 +3,7 @@
+ write_files:
+   - path: /etc/sysconfig/heat-params
+     owner: "root:root"
+-    permissions: "0644"
++    permissions: "0600"
+     content: |
+       KUBE_API_PUBLIC_ADDRESS="$KUBE_API_PUBLIC_ADDRESS"
+       KUBE_API_PRIVATE_ADDRESS="$KUBE_API_PRIVATE_ADDRESS"
+--- a/magnum/drivers/k8s_coreos_v1/templates/fragments/write-heat-params.yaml
++++ b/magnum/drivers/k8s_coreos_v1/templates/fragments/write-heat-params.yaml
+@@ -3,7 +3,7 @@
+ write_files:
+   - path: /etc/sysconfig/heat-params
+     owner: "root:root"
+-    permissions: "0644"
++    permissions: "0600"
+     content: |
+       KUBE_ALLOW_PRIV="$KUBE_ALLOW_PRIV"
+       KUBE_MASTER_IP="$KUBE_MASTER_IP"
+--- a/magnum/drivers/mesos_ubuntu_v1/templates/fragments/write-heat-params.yaml
++++ b/magnum/drivers/mesos_ubuntu_v1/templates/fragments/write-heat-params.yaml
+@@ -3,7 +3,7 @@
+ write_files:
+   - path: /etc/sysconfig/heat-params
+     owner: "root:root"
+-    permissions: "0644"
++    permissions: "0600"
+     content: |
+       MESOS_MASTERS_IPS="$MESOS_MASTERS_IPS"
+       EXECUTOR_REGISTRATION_TIMEOUT="$EXECUTOR_REGISTRATION_TIMEOUT"
+--- a/magnum/drivers/swarm_fedora_atomic_v1/templates/fragments/make-cert.py
++++ b/magnum/drivers/swarm_fedora_atomic_v1/templates/fragments/make-cert.py
+@@ -147,11 +147,6 @@
+                     "password": "%(trustee_password)s"
+                 }
+             }
+-        },
+-        "scope": {
+-            "OS-TRUST:trust": {
+-                "id": "%(trust_id)s"
+-            }
+         }
+     }
+ }
+@@ -159,7 +154,6 @@
+     params = {
+         'trustee_user_id': config['TRUSTEE_USER_ID'],
+         'trustee_password': config['TRUSTEE_PASSWORD'],
+-        'trust_id': config['TRUST_ID']
+     }
+     creds = creds_str % params
+     headers = {'Content-Type': 'application/json'}
+--- a/magnum/drivers/swarm_fedora_atomic_v1/templates/fragments/write-heat-params-master.yaml
++++ b/magnum/drivers/swarm_fedora_atomic_v1/templates/fragments/write-heat-params-master.yaml
+@@ -3,7 +3,7 @@
+ write_files:
+   - path: /etc/sysconfig/heat-params
+     owner: "root:root"
+-    permissions: "0644"
++    permissions: "0600"
+     content: |
+       WAIT_HANDLE_ENDPOINT="$WAIT_HANDLE_ENDPOINT"
+       WAIT_HANDLE_TOKEN="$WAIT_HANDLE_TOKEN"
+--- a/magnum/drivers/swarm_fedora_atomic_v1/templates/fragments/write-heat-params-node.yaml
++++ b/magnum/drivers/swarm_fedora_atomic_v1/templates/fragments/write-heat-params-node.yaml
+@@ -3,7 +3,7 @@
+ write_files:
+   - path: /etc/sysconfig/heat-params
+     owner: "root:root"
+-    permissions: "0644"
++    permissions: "0600"
+     content: |
+       WAIT_HANDLE_ENDPOINT="$WAIT_HANDLE_ENDPOINT"
+       WAIT_HANDLE_TOKEN="$WAIT_HANDLE_TOKEN"
+--- a/magnum/tests/base.py
++++ b/magnum/tests/base.py
+@@ -26,6 +26,7 @@
+ import testscenarios
+ 
+ from magnum.common import context as magnum_context
++from magnum.common import keystone as magnum_keystone
+ from magnum.objects import base as objects_base
+ from magnum.tests import conf_fixture
+ from magnum.tests import fake_notifier
+@@ -63,11 +64,18 @@
+                 }
+             }
+         }
++
++        trustee_domain_id = '12345678-9012-3456-7890-123456789abc'
++
+         self.context = magnum_context.RequestContext(
+             auth_token_info=token_info,
+             project_id='fake_project',
+             user_id='fake_user')
+ 
++        self.global_mocks = {}
++
++        self.keystone_client = magnum_keystone.KeystoneClientV3(self.context)
++
+         self.policy = self.useFixture(policy_fixture.PolicyFixture())
+ 
+         self.useFixture(fixtures.MockPatchObject(
+@@ -89,9 +97,22 @@
+ 
+         p = mock.patch.object(magnum_context, 'make_context',
+                               side_effect=make_context)
++
++        self.global_mocks['magnum.common.context.make_context'] = p
++
++        q = mock.patch.object(magnum_keystone.KeystoneClientV3,
++                              'trustee_domain_id',
++                              return_value=trustee_domain_id)
++
++        self.global_mocks[
++            'magnum.common.keystone.KeystoneClientV3.trustee_domain_id'] = q
++
+         self.mock_make_context = p.start()
+         self.addCleanup(p.stop)
+ 
++        self.mock_make_trustee_domain_id = q.start()
++        self.addCleanup(q.stop)
++
+         self.useFixture(conf_fixture.ConfFixture())
+         self.useFixture(fixtures.NestedTempfile())
+ 
+@@ -104,6 +125,12 @@
+ 
+         self.addCleanup(reset_pecan)
+ 
++    def start_global(self, name):
++        self.global_mocks[name].start()
++
++    def stop_global(self, name):
++        self.global_mocks[name].stop()
++
+     def _restore_obj_registry(self):
+         objects_base.MagnumObjectRegistry._registry._obj_classes \
+             = self._base_test_obj_backup
+--- a/magnum/tests/unit/common/test_keystone.py
++++ b/magnum/tests/unit/common/test_keystone.py
+@@ -55,6 +55,19 @@
+                     admin_tenant_name='service',
+                     group=keystone.CFG_LEGACY_GROUP)
+ 
++        # Disable global mocking for trustee_domain_id
++        self.stop_global(
++            'magnum.common.keystone.KeystoneClientV3.trustee_domain_id')
++
++    def tearDown(self):
++        # Re-enable global mocking for trustee_domain_id. We need this because
++        # mock blows up when trying to stop an already stopped patch (which it
++        # will do due to the addCleanup() in base.TestCase).
++        self.start_global(
++            'magnum.common.keystone.KeystoneClientV3.trustee_domain_id')
++
++        super(KeystoneClientTest, self).tearDown()
++
+     def test_client_with_password(self, mock_ks):
+         self.ctx.is_admin = True
+         ks_client = keystone.KeystoneClientV3(self.ctx)
+@@ -136,6 +149,7 @@
+         ks_client.create_trust(trustee_user='888888')
+ 
+         mock_ks.return_value.trusts.create.assert_called_once_with(
++            delegation_depth=0,
+             trustor_user='123456', project='654321',
+             trustee_user='888888', role_names=['role1', 'role2'],
+             impersonation=True)
+@@ -152,6 +166,7 @@
+         ks_client.create_trust(trustee_user='888888')
+ 
+         mock_ks.return_value.trusts.create.assert_called_once_with(
++            delegation_depth=0,
+             trustor_user='123456', project='654321',
+             trustee_user='888888', role_names=['role3'],
+             impersonation=True)
+--- a/magnum/tests/unit/conductor/handlers/common/test_trust_manager.py
++++ b/magnum/tests/unit/conductor/handlers/common/test_trust_manager.py
+@@ -37,6 +37,7 @@
+         mock_generate_password.return_value = mock_password
+         mock_cluster = mock.MagicMock()
+         mock_cluster.uuid = 'mock_cluster_uuid'
++        mock_cluster.project_id = 'mock_cluster_project_id'
+         mock_keystone = mock.MagicMock()
+         mock_trustee = mock.MagicMock()
+         mock_trustee.id = 'mock_trustee_id'
+@@ -52,7 +53,7 @@
+         trust_manager.create_trustee_and_trust(self.osc, mock_cluster)
+ 
+         mock_keystone.create_trustee.assert_called_once_with(
+-            mock_cluster.uuid,
++            '%s_%s' % (mock_cluster.uuid, mock_cluster.project_id),
+             mock_password,
+         )
+         mock_keystone.create_trust.assert_called_once_with(
+--- a/magnum/tests/unit/conductor/handlers/test_cluster_conductor.py
++++ b/magnum/tests/unit/conductor/handlers/test_cluster_conductor.py
+@@ -191,6 +191,11 @@
+         mock_poller.poll_and_check.return_value = loopingcall.LoopingCallDone()
+         mock_heat_poller_class.return_value = mock_poller
+         osc = mock.sentinel.osc
++
++        def return_keystone():
++            return self.keystone_client
++
++        osc.keystone = return_keystone
+         mock_openstack_client_class.return_value = osc
+ 
+         def create_stack_side_effect(context, osc, cluster, timeout):
+--- a/magnum/tests/unit/conductor/handlers/test_k8s_cluster_conductor.py
++++ b/magnum/tests/unit/conductor/handlers/test_k8s_cluster_conductor.py
+@@ -67,7 +67,7 @@
+             'trustee_username': 'fake_trustee',
+             'trustee_password': 'fake_trustee_password',
+             'trustee_user_id': '7b489f04-b458-4541-8179-6a48a553e656',
+-            'trust_id': 'bd11efc5-d4e2-4dac-bbce-25e348ddf7de',
++            'trust_id': '',
+             'coe_version': 'fake-version',
+         }
+         self.context.auth_url = 'http://192.168.10.10:5000/v3'
+@@ -173,7 +173,7 @@
+             'trustee_username': 'fake_trustee',
+             'trustee_password': 'fake_trustee_password',
+             'trustee_user_id': '7b489f04-b458-4541-8179-6a48a553e656',
+-            'trust_id': 'bd11efc5-d4e2-4dac-bbce-25e348ddf7de',
++            'trust_id': '',
+             'auth_url': 'http://192.168.10.10:5000/v3',
+             'insecure_registry_url': '10.0.0.1:5000',
+             'kube_version': 'fake-version',
+@@ -209,6 +209,10 @@
+                               'RegionOne',
+                               group='docker_registry')
+ 
++        cfg.CONF.set_override('cluster_user_trust',
++                              True,
++                              group='trust')
++
+         (template_path,
+          definition,
+          env_files) = cluster_conductor._extract_template_definition(
+@@ -242,7 +246,7 @@
+             'swift_region': 'RegionOne',
+             'tenant_name': 'fake_tenant',
+             'tls_disabled': False,
+-            'trust_id': 'bd11efc5-d4e2-4dac-bbce-25e348ddf7de',
++            'trust_id': '',
+             'trustee_domain_id': self.mock_keystone.trustee_domain_id,
+             'trustee_password': 'fake_trustee_password',
+             'trustee_user_id': '7b489f04-b458-4541-8179-6a48a553e656',
+@@ -306,7 +310,7 @@
+             'trustee_username': 'fake_trustee',
+             'trustee_password': 'fake_trustee_password',
+             'trustee_user_id': '7b489f04-b458-4541-8179-6a48a553e656',
+-            'trust_id': 'bd11efc5-d4e2-4dac-bbce-25e348ddf7de',
++            'trust_id': '',
+             'auth_url': 'http://192.168.10.10:5000/v3',
+             'cluster_uuid': self.cluster_dict['uuid'],
+             'magnum_url': self.mock_osc.magnum_url.return_value,
+@@ -363,7 +367,7 @@
+             'trustee_username': 'fake_trustee',
+             'trustee_password': 'fake_trustee_password',
+             'trustee_user_id': '7b489f04-b458-4541-8179-6a48a553e656',
+-            'trust_id': 'bd11efc5-d4e2-4dac-bbce-25e348ddf7de',
++            'trust_id': '',
+             'auth_url': 'http://192.168.10.10:5000/v3',
+             'cluster_uuid': self.cluster_dict['uuid'],
+             'magnum_url': self.mock_osc.magnum_url.return_value,
+@@ -530,7 +534,7 @@
+             'trustee_username': 'fake_trustee',
+             'trustee_password': 'fake_trustee_password',
+             'trustee_user_id': '7b489f04-b458-4541-8179-6a48a553e656',
+-            'trust_id': 'bd11efc5-d4e2-4dac-bbce-25e348ddf7de',
++            'trust_id': '',
+             'auth_url': 'http://192.168.10.10:5000/v3',
+             'insecure_registry_url': '10.0.0.1:5000',
+             'kube_version': 'fake-version',
+--- a/magnum/tests/unit/conductor/handlers/test_mesos_cluster_conductor.py
++++ b/magnum/tests/unit/conductor/handlers/test_mesos_cluster_conductor.py
+@@ -37,6 +37,7 @@
+             'http_proxy': 'http_proxy',
+             'https_proxy': 'https_proxy',
+             'no_proxy': 'no_proxy',
++            'registry_enabled': False,
+             'server_type': 'vm',
+             'volume_driver': 'volume_driver',
+             'labels': {'rexray_preempt': 'False',
+@@ -109,7 +110,7 @@
+             'trustee_username': 'fake_trustee',
+             'trustee_password': 'fake_trustee_password',
+             'trustee_user_id': '7b489f04-b458-4541-8179-6a48a553e656',
+-            'trust_id': 'bd11efc5-d4e2-4dac-bbce-25e348ddf7de',
++            'trust_id': '',
+             'volume_driver': 'volume_driver',
+             'auth_url': 'http://192.168.10.10:5000/v3',
+             'region_name': self.mock_osc.cinder_region_name.return_value,
+@@ -158,7 +159,7 @@
+             'trustee_username': 'fake_trustee',
+             'trustee_password': 'fake_trustee_password',
+             'trustee_user_id': '7b489f04-b458-4541-8179-6a48a553e656',
+-            'trust_id': 'bd11efc5-d4e2-4dac-bbce-25e348ddf7de',
++            'trust_id': '',
+             'auth_url': 'http://192.168.10.10:5000/v3',
+             'region_name': self.mock_osc.cinder_region_name.return_value,
+             'username': 'mesos_user',
+@@ -208,7 +209,7 @@
+             'trustee_username': 'fake_trustee',
+             'trustee_password': 'fake_trustee_password',
+             'trustee_user_id': '7b489f04-b458-4541-8179-6a48a553e656',
+-            'trust_id': 'bd11efc5-d4e2-4dac-bbce-25e348ddf7de',
++            'trust_id': '',
+             'volume_driver': 'volume_driver',
+             'auth_url': 'http://192.168.10.10:5000/v3',
+             'region_name': self.mock_osc.cinder_region_name.return_value,
+@@ -260,7 +261,7 @@
+             'trustee_username': 'fake_trustee',
+             'trustee_password': 'fake_trustee_password',
+             'trustee_user_id': '7b489f04-b458-4541-8179-6a48a553e656',
+-            'trust_id': 'bd11efc5-d4e2-4dac-bbce-25e348ddf7de',
++            'trust_id': '',
+             'volume_driver': 'volume_driver',
+             'auth_url': 'http://192.168.10.10:5000/v3',
+             'region_name': self.mock_osc.cinder_region_name.return_value,
+--- a/magnum/tests/unit/conductor/handlers/test_swarm_cluster_conductor.py
++++ b/magnum/tests/unit/conductor/handlers/test_swarm_cluster_conductor.py
+@@ -68,6 +68,12 @@
+             'trust_id': 'bd11efc5-d4e2-4dac-bbce-25e348ddf7de',
+             'coe_version': 'fake-version'
+         }
++
++        # We need this due to volume_driver=rexray
++        cfg.CONF.set_override('cluster_user_trust',
++                              True,
++                              group='trust')
++
+         osc_patcher = mock.patch('magnum.common.clients.OpenStackClients')
+         self.mock_osc_class = osc_patcher.start()
+         self.addCleanup(osc_patcher.stop)
+@@ -255,7 +261,7 @@
+             'trustee_username': 'fake_trustee',
+             'trustee_password': 'fake_trustee_password',
+             'trustee_user_id': '7b489f04-b458-4541-8179-6a48a553e656',
+-            'trust_id': 'bd11efc5-d4e2-4dac-bbce-25e348ddf7de',
++            'trust_id': '',
+             'auth_url': 'http://192.168.10.10:5000/v3',
+             'swarm_version': 'fake-version',
+             'rexray_preempt': 'False'
diff -Nru magnum-3.1.1/debian/patches/series magnum-3.1.1/debian/patches/series
--- magnum-3.1.1/debian/patches/series	2017-04-04 17:31:50.000000000 +0200
+++ magnum-3.1.1/debian/patches/series	2017-06-01 16:31:39.000000000 +0200
@@ -1,2 +1,3 @@
 install-missing-files.patch
 allow-sqla-1.1.patch
+CVE-2016-7404.patch

--- End Message ---
--- Begin Message ---
Unblocked magnum.

--- End Message ---

Reply to: