No problem. 

Filed here: https://bugs.launchpad.net/heat/+bug/1302578 for continued 
discussion. 

-M

________________________________
Kind Regards,

Michael D. Elder

STSM | Master Inventor
mdel...@us.ibm.com  | linkedin.com/in/mdelder

"Success is not delivering a feature; success is learning how to solve the 
customer’s problem.” -Mark Cook



From:   Steve Baker <sba...@redhat.com>
To:     openstack-dev@lists.openstack.org
Date:   04/03/2014 10:13 PM
Subject:        Re: [openstack-dev] [heat] Problems with software config 
and Heat standalone configurations



On 04/04/14 14:26, Michael Elder wrote:
Hello, 

While adopting the latest from the software configurations in Icehouse, we 
discovered an issue with the new software configuration type and its 
assumptions about using the heat client to perform behavior. 

The change was introduced in: 

commit 21f60b155e4b65396ebf77e05a0ef300e7c3c1cf 
Author: Steve Baker <sba...@redhat.com> 
Change: https://review.openstack.org/#/c/67621/ 

The net is that the software config type in software_config.py lines 
147-152 relies on the heat client to create/clone software configuration 
resources in the heat database: 

    def handle_create(self): 
        props = dict(self.properties) 
        props[self.NAME] = self.physical_resource_name() 

        sc = self.heat().software_configs.create(**props) ## HERE THE HEAT 
CLIENT IS CREATING A NEW SOFTWARE_CONFIG TO MAKE EACH ONE IMMUTABLE 
        self.resource_id_set(sc.id) 

My concerns with this approach: 

When used in standalone mode, the Heat engine receives headers which are 
used to drive authentication (X-Auth-Url, X-Auth-User, X-Auth-Key, ..): 

curl -i -X POST -H 'X-Auth-Key: password' -H 'Accept: application/json' -H 
'Content-Type: application/json' -H 'X-Auth-Url: http://[host]:5000/v2.0' 
-H 'X-Auth-User: admin' -H 'User-Agent: python-heatclient' -d '{...}' 
http://10.0.2.15:8004/v1/{tenant_id} 

In this mode, the heat config file indicates standalone mode and can also 
indicate multicloud support: 

# /etc/heat/heat.conf 
[paste_deploy] 
flavor = standalone 

[auth_password] 
allowed_auth_uris = http://[host1]:5000/v2.0,http://[host2]:5000/v2.0 
multi_cloud = true 

Any keystone URL which is referenced is unaware of the orchestration 
engine which is interacting with it. Herein lies the design flaw. 
Its not so much a design flaw, its a bug where a new piece of code 
interacts poorly with a mode that currently has few users and no 
integration test coverage.


When software_config calls self.heat(), it resolves clients.py's heat 
client: 

    def heat(self): 
        if self._heat: 
            return self._heat 
 
        con = self.context 
        if self.auth_token is None: 
            logger.error(_("Heat connection failed, no auth_token!")) 
            return None 
        # try the token 
        args = { 
                'auth_url': con.auth_url, 
                'token': self.auth_token, 
                'username': None, 
                'password': None, 
                'ca_file': self._get_client_option('heat', 'ca_file'), 
                'cert_file': self._get_client_option('heat', 'cert_file'), 

                'key_file': self._get_client_option('heat', 'key_file'), 
                'insecure': self._get_client_option('heat', 'insecure') 
         } 

        endpoint_type = self._get_client_option('heat', 'endpoint_type') 
        endpoint = self._get_heat_url() 
        if not endpoint: 
            endpoint = self.url_for(service_type='orchestration', 
                                    endpoint_type=endpoint_type) 
        self._heat = heatclient.Client('1', endpoint, **args) 

        return self._heat 

Here, an attempt to look up the orchestration URL (which is already 
executing in the context of the heat engine) comes up wrong because 
Keystone doesn't know about this remote standalone Heat engine. 

If you look at self._get_heat_url() you'll see that the heat.conf 
[clients_heat] url will be used for the heat endpoint if it is set. I 
would recommend setting that for standalone mode. A devstack change for 
HEAT_STANDALONE would be helpful here.

Further, at this point, the username and password are null, and when the 
auth_password standza is applied in the config file, Heat will deny any 
attempts at authorization which only provide a token. As I understand it 
today, that's because it doesn't have individual keystone admin users for 
all remote keystone services in the list of allowed_auth_urls. Hence, if 
only provided with a token, I don't think the heat engine can validate the 
token against the remote keystone. 

One workaround that I've implemented locally is to change the logic to 
check for standalone mode and send the username and password. 

       flavor = 'default' 
        try: 
            logger.info("Configuration is %s" % str(cfg.CONF)) 
            flavor = cfg.CONF.paste_deploy.flavor 
        except cfg.NoSuchOptError as nsoe: 
            flavor = 'default' 
        logger.info("Flavor is %s" % flavor) 
 
        # We really should examine the pipeline to determine whether we're 
using authtoken or authpassword. 
        if flavor == 'standalone': 
 
            context_map = self.context.to_dict() 
 
            if 'username' in context_map.keys(): 
                username = context_map['username'] 
            else: 
                username = None 
 
            if 'password' in context_map.keys(): 
                password = context_map['password'] 
            else: 
                password = None 
 
            logger.info("Configuring username='%s' and password='%s'" % 
(username, password)) 
            args = { 
                'auth_url': con.auth_url, 
                'token': None, 
                'username': username, 
                'password': password, 
                'ca_file': self._get_client_option('heat', 'ca_file'), 
                'cert_file': self._get_client_option('heat', 'cert_file'), 

                'key_file': self._get_client_option('heat', 'key_file'), 
                'insecure': self._get_client_option('heat', 'insecure') 
            }   
        else: 
            if self.auth_token is None: 
                logger.error(_("Heat connection failed, no auth_token!")) 
                return None 
... 

Is this a known issue? 
This is a great summary of the problem, but it really belongs in a 
launchpad bug. Lets discuss potential solutions there.

https://bugs.launchpad.net/heat/+filebug

cheers_______________________________________________
OpenStack-dev mailing list
OpenStack-dev@lists.openstack.org
http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev


_______________________________________________
OpenStack-dev mailing list
OpenStack-dev@lists.openstack.org
http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev

Reply via email to