[
https://issues.apache.org/jira/browse/LIBCLOUD-90?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13049047#comment-13049047
]
Tomaz Muraus commented on LIBCLOUD-90:
--------------------------------------
Done, for now we just make sure that the first argument is actually a string.
Another thing we could do is to just read a file content in case a user passes
in a file as the script argument. I'm not sure how useful that is, because in
most cases you probably want to replace some placeholders in your script file
and not just pass in the raw file content.
It's also kinda "magic" :)
Opinions?
> ScriptDeployment fails-slow and swallows errors
> -----------------------------------------------
>
> Key: LIBCLOUD-90
> URL: https://issues.apache.org/jira/browse/LIBCLOUD-90
> Project: Libcloud
> Issue Type: Improvement
> Components: Core
> Affects Versions: 0.5.0
> Reporter: Paul Oswald
> Priority: Minor
>
> If you create a ScriptDeployment object by passing in a file instead of a
> str, and then pass that to deploy_node you get a failure with an unhelpful
> message. There are a few problems here: 1.) the ScriptDeployment should
> ensure that the arguments are in a format it can handle on __init__ before it
> gets to run when it's too late and the node has already been created. 2.) an
> error in this part of the code will throw an exception that will be caught,
> swallowed and re-thrown as a DeploymentError without any indication of the
> underlying problem 3.) the ScriptDeployment could be improved by allowing it
> to handle a file type object by just calling file.read() on it.
> You can reproduce this by doing something like this:
> script = ScriptDeployment(open("/".join([root, "bin",
> os.path.expanduser("bootstrap.sh")])))
> node = cloud.deploy_node(name="test-name", image=69, size=1,
> deploy=script)
> To fix it, you just need to do this:
> script = ScriptDeployment(open("/".join([root, "bin",
> os.path.expanduser("bootstrap.sh")])).read())
> The underlying stack trace thrown from paramiko when you send in a file is:
> Traceback (most recent call last):
> File
> "/Users/poswald/.virtualenvs/myproj/lib/python2.6/site-packages/fabric/main.py",
> line 551, in main
> commands[name](*args, **kwargs)
> File "/Users/poswald/Projects/hats/fabfile.py", line 289, in provision
> node = cloud.deploy_node(name=name, image=image, size=size,
> deploy=script, ssh_timeout=300)
> File
> "/Users/poswald/.virtualenvs/myproj/lib/python2.6/site-packages/libcloud/compute/base.py",
> line 564, in deploy_node
> n = kwargs["deploy"].run(node, client)
> File
> "/Users/poswald/.virtualenvs/myproj/lib/python2.6/site-packages/libcloud/compute/deployment.py",
> line 94, in run
> client.put(path=self.name, chmod=755, contents=self.script)
> File
> "/Users/poswald/.virtualenvs/myproj/lib/python2.6/site-packages/libcloud/compute/ssh.py",
> line 158, in put
> ak.write(contents)
> File
> "/Users/poswald/.virtualenvs/myproj/lib/python2.6/site-packages/paramiko/file.py",
> line 314, in write
> self._write_all(data)
> File
> "/Users/poswald/.virtualenvs/myproj/lib/python2.6/site-packages/paramiko/file.py",
> line 434, in _write_all
> while len(data) > 0:
> TypeError: object of type 'file' has no len()
> The relevant code is in
> https://github.com/apache/libcloud/blob/trunk/libcloud/compute/base.py#L564
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira