a not-so-technical user's experience with Conductor

Martin Povolny mpovolny at redhat.com
Tue Oct 23 09:47:19 UTC 2012


On Mon, Oct 22, 2012 at 11:48:00AM -0400, Matt Wagner wrote:
> On Mon, Oct 22, 2012 at 10:56:26AM +0200, Martin Povolny wrote:
> > Setup: Fedora 16 RPMs, on top of that Conductor from githup so that I
> > don't crash into what is already fixed.
> 
> Thanks for sending this! The new-user experience is something we
> obviously need to work on a bit... Some notes inline:
> 
> > Story:
> > 
> > ---------------------------
> > 
> > Log in, adding a provider
> > 
> > http://192.168.122.174:3000/providers
> > #1 error: "Provider name must start with 'ec2-'"
> > 
> > WTF? why? the UI allows any name! (was told, this is fixed somewhere)
> 
> I'd be curious to know if this was actually fixed, and if the fix was
> that we were no longer required to have "magic" names that indicated
> provider type.

As I understand it, yes, ImageFactory should be fixed. But I'm not sure
about it, will try to find out.

> 
> > Under Providers I click "Provider Accounts" and start adding an account:
> > 1 error prohibited this Provider Account from being saved
> > 
> > #2 error: "Cannot add the Provider Account." -- WTF message? tell's me nothing
> > 
> > Conductor (Rails) log, tells me nothing, but a quick look into /var/log/messages!! to find out I forgot to disable selinux
> > (DC already fixed the logging AFAIK)
> 
> In general, we don't do a great job of indicating errors with our
> services in our messages. In some cases it's because the other service
> doesn't give us a great error message, but even if that's the case I
> think it would have been better if we said something like, "Cannot add
> the Provider Account because Deltacloud returned an unexpected error.
> Check the Deltacloud log for more information."
> 
> If we can get a more specific error message, that would be better, of
> course.
> 
> > Next I Navigate to Content; I see a catalog "Default" I click that
> > 
> > I see "New Deployable"
> > 
> > Now I remember my previous experience I know, that to make a deployable I need an Image!
> > 
> > #3 problem: the UI should tell me I need an image or I'm lost at this point
> 
> This is an interesting user story, because once you mention it, it makes
> perfect sense and I could see how it would be an easy mistake to make --
> but it never occurred to me to test that and see if we did something
> sensible.
> 
> > So I navigate back, looking for a place to work with images. Image -- that is probably "Content" so look there, not in "Environment"
> > 
> > nothing there
> 
> This has tripped me up so many times! It definitely seems like images
> should be under "Content", but since they're scoped to environments, we
> put them under the Environments tab instead. IMHO, this whole workflow
> needs work.
> 
> > ok, I look into "Environments", it brings me to http://192.168.122.174:3000/pool_families (pool_families) ;-)
> 
> If we ever settle with PM on one set of names, we should consider
> renaming controllers to match. (Environments are the new name for "Pool
> families", but they're called a third name in the downstream product.)
> 
> > Wow, theres a greyed-out "Images" let's click 
> > 
> > Now failed again I see an empty list, 
> > 
> > #4 problem NO BUTTON to create an image from listing of images! WTF?
> 
> Anyone opposed to adding a button to the list? I've also gone to the
> images pane expecting the ability to create/import an image and been
> kind of frustrated.

The button is obviously missing. You can pick the pool from a drop-down
when creating the image. Especially when you have just one pool, where
every user will start.

> 
> > Ok, back to Environments, it has to be there, if it's not under Images
> > 
> > "Default" is clickable --> click and go to "http://192.168.122.174:3000/pools/1"
> > 
> > There's a text "Catalog Images" I click that it resembles "Images" I need an image to make a deployable, remember?
> 
> A while back I proposed adding some conversational / descriptive text on
> pages asking for input, so that the Catalog Images page might say
> something like, "Catalog Images allow you to attach existing Images to a
> Catalog for ease of launching. Click 'Create New' to define a new
> Catalog Image below." -- or something to that effect.
> 
> > #5 problem shoot me! -- no link or button "New image" :-(
> > 
> > Back to http://192.168.122.174:3000/pool_families now I notice "Import Image", "New Image"
> > 
> > I choose "New Image" -->  http://192.168.122.174:3000/images/new?environment=1
> > 
> > There I read: "Choose one of the following options to upload or import an image into the "default Environment"."
> > Below is written "Choose an Image Template file:" but who reads all the text?
> 
> Heh, "who reads all the text?" is really a very fair point, but now I'm
> not sure how to make this much clearer. The "upload or import an image"
> should probably read, "upload an image template or import a reference to
> an existing image" or something along those lines, to make it clear that
> you're not actually transferring images.

One text reads "import an image" -- that's the first one. I see it and I
immediately think I have to provide an image. Then I don't read the 2nd
text that reads "Image Template".

If the word "Template" was brought to attention I would not upload an
ISO ;-)

Template for an image.

> 
> > As an average linux user who is prompted for an image I provide an ISO image of the latest Ubuntu.
> 
> Noooooo!
> 
> > 
> > #6 problem: after a dozen of minutes I get an empty browser window; the Rails log reads:
> > 
> >   Rendered layouts/_admin_nav.html.haml (19.5ms)
> >   Rendered images/edit_xml.html.haml within layouts/application (365004.5ms)
> >   Rendered layouts/_new_notification.html.haml (45.3ms)
> >   Rendered layouts/_footer.html.haml (882.3ms)
> >   Rendered layouts/converge-ui/_header_layout.haml (4.9ms)
> >   Rendered layouts/converge-ui/_base.haml (41565.7ms)
> >   Rendered layouts/converge-ui/shell_layout.haml (201594.5ms)
> > Completed 200 OK in 753340ms (Views: 743206.8ms | ActiveRecord: 5.9ms)
> > terminate called after throwing an instance of 'std::runtime_error'
> >   what():  no allocation for outbound data
> > Aborted
> > 
> > hint: 1) add a size limit; 2) guess content type before starting XML parser
> 
> Yes, we should definitely put some limits in place.
> 
> > I restart Conductor, lost again -- where do I add an image?
> > 
> > #7 problem: in env/images there's a link to add image but in the list of images there's none; that is not intuitive
> 
> +1
> 
> > Next I manage to put in a valid XML and actually have a valid image
> > 
> > Next I found a button to create a Deployable from an image.
> > 
> > Next I get a page saying: "Images are not Built" and no hint what to do about it
> > 
> > http://192.168.122.174:3000/catalogs/1/deployables/1
> > 
> > There's a green button, it reads "Images valid" -- green is good, let's click it!
> 
> It would be interesting to usability-test this page, because it's
> clearly lacking right now.
> 
> > But it leads to a page to edit deployable XML
> > http://192.168.122.174:3000/catalogs/1/deployables/1 ---> click "Images Valid" (green button) ----> http://192.168.122.174:3000/catalogs/1/deployables/1/edit?edit_xml=true
> > 
> > #8 problem: "Images Valid" should read "edit the deployable XML" and is probably should not be green
> 
> I'm surprised "Images Valid" was even a button. If you had asked me what
> it did, I never would have guessed "Edit the XML".
> 
> Green for conveying "all systems go" makes sense, but making it look
> like a button, particularly the most prominent one on the page, is not
> good.
> 
> > On the page under "Build Status" there's "Images are not Built" with CAPITAL B. But there's no hint what shall I do about it.
> 
> I think we should fix this message, to (a) not randomly capitalize
> "Built", and (b) tell the user what to do.
> 
> > I got an advice from Jenik:	"for now, got to images show page (env -> images)"
> > 
> > http://192.168.122.174:3000/images/067f4d76-19fa-11e2-8f46-525400b4f6a2
> > 
> > there's a grey button there.	It reads "Build". I clicked it
> > 
> > 	Failed.  Response code = 500.  Response message = Internal Server Error.
> > 	/home/martin/.gem/ruby/1.9.1/gems/activeresource-3.2.3/lib/active_resource/connection.rb:148:in `handle_response'
> > 	 /home/martin/.gem/ruby/1.9.1/gems/activeresource-3.2.3/lib/active_resource/connection.rb:115:in `request'
> > 	 /home/martin/.gem/ruby/1.9.1/bundler/gems/aeolus-image-rubygem-4bffe3f60ce3/lib/aeolus_image/active_resource_oauth_client.rb:30:in `request_with_oauth'
> > 	 /home/martin/.gem/ruby/1.9.1/gems/activeresource-3.2.3/lib/active_resource/connection.rb:92:in `block in put'
> > 	 /home/martin/.gem/ruby/1.9.1/gems/activeresource-3.2.3/lib/active_resource/connection.rb:218:in `with_auth'
> > 	 /home/martin/.gem/ruby/1.9.1/gems/activeresource-3.2.3/lib/active_resource/connection.rb:92:in `put'
> > 
> > probably some component missing, the 'intuitive' code of 500 suggests I forgot to install or configure image-factory
> > 
> > problem was with oauth credentials
> > 
> > #8 problem: there should be a nice error message telling me about auth problem
> 
> FWIW, I filed a BZ for this a while ago:
> https://bugzilla.redhat.com/show_bug.cgi?id=856364
> 
> That's on the Image Factory side, but when it starts reporting something
> other than a blanket 500, we should display a good error message in our
> app, too.
> 
> > #9 problem also the image factory log is a mess. User should get something like "invalid credentials for image factory, configure the image factory, please"
> > 
> > 	2012-10-17 09:12:04,299 INFO root thread(MainThread) Message: Launched as daemon...
> > 	2012-10-17 09:12:04,394 DEBUG root thread(MainThread) Message: Unable to start faulthandler - multi-thread tracebacks will not be available
> > 	Traceback (most recent call last):
> > 	  File "/usr/bin/imagefactory", line 176, in main
> > 	    import faulthandler
> > 	ImportError: No module named faulthandler
> > 
> > 	2012-10-17 09:12:04,433 DEBUG paste.httpserver.ThreadPool thread(worker 0) Message: Started new worker 139691243161344: Initial worker pool
> > 
> > 	2012-10-19 16:43:36,291 ERROR imgfac.rest.imagefactory thread(worker 4) Message: 'oauth_consumer_key'
> > 	Traceback (most recent call last):
> > 	  File "/usr/lib/python2.7/site-packages/imgfac/rest/imagefactory.py", line 49, in validate_two_leg_oauth
> > 	    oauth_consumer = Consumer(request.params['oauth_consumer_key'])
> > 	  File "/usr/lib/python2.7/site-packages/imgfac/rest/bottle.py", line 1528, in __getitem__
> > 	    def __getitem__(self, key): return self.dict[key][-1]
> > 	KeyError: 'oauth_consumer_key'
> > 	(END)
> > 
> >   Failed.  Response code = 500.  Response message = Internal Server Error.
> >   /home/martin/.gem/ruby/1.9.1/gems/activeresource-3.2.3/lib/active_resource/connection.rb:148:in `handle_response'
> >    /home/martin/.gem/ruby/1.9.1/bundler/gems/aeolus-image-rubygem-4bffe3f60ce3/lib/aeolus_image/active_resource_oauth_client.rb:52:in `request_with_oauth'
> >    /home/martin/.gem/ruby/1.9.1/gems/activeresource-3.2.3/lib/active_resource/connection.rb:92:in `block in put'
> >    /home/martin/.gem/ruby/1.9.1/gems/activeresource-3.2.3/lib/active_resource/connection.rb:218:in `with_auth'
> >   	mpovolny: Hrm, in that case, I wonder if oauth.json was wrong.
> 
> Ah, yeah, that falls under the existing BZ, too.
> 
> > 
> > 
> >   after I copied the credentials I got:
> > 
> > 	2012-10-19 16:57:22,683 ERROR imgfac.rest.imagefactory thread(worker 9) Message: 'NoneType' object has no attribute 'encode'
> > 	Traceback (most recent call last):
> > 	  File "/usr/lib/python2.7/site-packages/imgfac/rest/imagefactory.py", line 50, in validate_two_leg_oauth
> > 	    oauth_server.verify_request(req, oauth_consumer, None)
> > 	  File "/usr/lib/python2.7/site-packages/oauth2/__init__.py", line 712, in verify_request
> > 	    self._check_signature(request, consumer, token)
> > 	  File "/usr/lib/python2.7/site-packages/oauth2/__init__.py", line 765, in _check_signature
> > 	    valid = signature_method.check(request, consumer, token, signature)
> > 	  File "/usr/lib/python2.7/site-packages/oauth2/__init__.py", line 816, in check
> > 	    built = self.sign(request, consumer, token)
> > 	  File "/usr/lib/python2.7/site-packages/oauth2/__init__.py", line 841, in sign
> > 	    key, raw = self.signing_base(request, consumer, token)
> > 	  File "/usr/lib/python2.7/site-packages/oauth2/__init__.py", line 833, in signing_base
> > 	    key = '%s&' % escape(consumer.secret)
> > 	  File "/usr/lib/python2.7/site-packages/oauth2/__init__.py", line 158, in escape
> > 	    return urllib.quote(s.encode('utf-8'), safe='~')
> > 	AttributeError: 'NoneType' object has no attribute 'encode'
> > 
> >   probably did not copy them right, but again, I would expect a sane error message
> > 
> > Finally I disabled oauth, clicked the button and built the image. More
> > fun to come.
> 
> Well, sounds like that went smoothly! ;)
> 
> Seriously, though, thanks for sharing this. It's obvious that we have a
> lot of work to do on usability, but it's easy for us (or at least me) as
> developers to know what a form is asking and thus not realize that a
> normal user would have no clue what it was asking.
> 

Again, thank you for reading and I will be happy to fix some of the
above myself.

-- 
Martin Povolny <mpovolny at redhat.com>
tel. +420 777714458



More information about the aeolus-devel mailing list