]> review.fuel-infra Code Review - openstack-build/horizon-build.git/commitdiff
Update specs to 2013.2.3 version openstack-ci/fuel-4.1.1/2013.2.3
authorDmitry Burmistrov <dburmistrov@mirantis.com>
Fri, 16 May 2014 10:34:36 +0000 (14:34 +0400)
committerDmitry Burmistrov <dburmistrov@mirantis.com>
Fri, 16 May 2014 10:59:20 +0000 (14:59 +0400)
Change-Id: I8ee371fa3379987fdb34b83ae8bfeec681f2e2b9

18 files changed:
debian/changelog
debian/openstack-dashboard.postinst
debian/patches/revert-stable-havana-requirements.patch [new file with mode: 0644]
debian/patches/series
debian/patches/ubuntu_settings.patch
debian/static/openstack-dashboard/js/59722976ae97.js [moved from debian/static/openstack-dashboard/js/271a130e6a31.js with 99% similarity]
debian/static/openstack-dashboard/manifest.json
rpm/SOURCES/0001-Don-t-access-the-net-while-building-docs.patch
rpm/SOURCES/0002-disable-debug-move-web-root.patch
rpm/SOURCES/0003-change-lockfile-location-to-tmp-and-also-add-localho.patch
rpm/SOURCES/0004-Add-a-customization-module-based-on-RHOS.patch
rpm/SOURCES/0005-Revert-Use-oslo.sphinx-and-remove-local-copy-of-doc-.patch [deleted file]
rpm/SOURCES/0005-move-RBAC-policy-files-and-checks-to-etc-openstack-d.patch [moved from rpm/SOURCES/0006-move-RBAC-policy-files-and-checks-to-etc-openstack-d.patch with 92% similarity]
rpm/SOURCES/0006-move-SECRET_KEYSTORE-to-var-lib-openstack-dashboard.patch [moved from rpm/SOURCES/0007-move-SECRET_KEY-secret_key_store-to-tmp.patch with 83% similarity]
rpm/SOURCES/0008-fix-up-issues-with-customization.patch [deleted file]
rpm/SOURCES/0009-do-not-truncate-the-logo-related-rhbz-877138.patch [deleted file]
rpm/SOURCES/0010-move-SECRET_KEYSTORE-to-var-lib-openstack-dashboard.patch [deleted file]
rpm/SPECS/python-django-horizon.spec

index 56c3afb9b77cf0921932cf0db17b8af0f883af8c..57f5a9f9388fb6c92922385bb6a0a1d3e2bd8a1f 100644 (file)
@@ -1,8 +1,115 @@
-horizon (1:2013.2-0ubuntu1~cloud0) precise-havana; urgency=low
+horizon (1:2013.2.3-0ubuntu1~cloud0) precise-havana; urgency=medium
 
-  * New upstream release for the Ubuntu Cloud Archive. 
+  * New upstream release for the Ubuntu Cloud Archive.
 
- -- Chuck Short <zulcss@ubuntu.com>  Wed, 16 Oct 2013 20:28:28 -0400
+ -- Openstack Ubuntu Testing Bot <openstack-testing-bot@ubuntu.com>  Mon, 14 Apr 2014 07:58:45 -0400
+
+horizon (1:2013.2.3-0ubuntu1) saucy-proposed; urgency=medium
+
+  * Resynchronize with stable/havana (82cb9f6) (LP: #1302575):
+    - [b2259b3] Don't copy the flavorid when updating flavors
+    - [8db4687] Allow snapshots of paused and suspended instances
+    - [cf181c1] Reduce number of novaclient calls
+    - [82cb9f6] Fixing tests to work with keystoneclient 0.6.0
+
+ -- Corey Bryant <corey.bryant@canonical.com>  Fri, 04 Apr 2014 10:52:55 -0400
+
+horizon (1:2013.2.2-0ubuntu1) saucy-proposed; urgency=low
+
+  [ Chuck Short ]
+  * Resynchronize with stable/havana (36e0ab5) (LP: #1284643):
+    - [e73ff07] run_tests.sh fails with a fresh venv due to django 1.6
+      installed LP: 1250581
+    - [3e93b54] Email shouldn't be a mandatory attribute LP: 1260423
+    - [2c1f1f3] Wrap call to extension_supported on Launch Instance with
+      try/except LP: 1262223
+    - [2e11482] Unit tests failing with raise
+      UnknownMethodCallError('management_url') LP: 1268631
+    - [c6d38a1] Metering dashboard. Marker could not be found (havana)
+      LP: 1260528
+    - [2b6dfa7] keypairs can not have an '@' sign in the name LP: 1265563
+    - [8ba7780] Cannot see confirmation message when working on longer pages
+      LP: 1251361
+    - [edd8ee4] fix help text in "Create An image" window
+    - [aa55b24] Inconsistance between horizon and django_openstack_auth default
+      keystone version LP: 1231357
+    - [7a8eadc] LBaaS. HealthMonitor representation should be improved
+      LP: 1237377
+    - [02e7b6e] "neutron lb-pool-list" running by admin returns also non-admin
+      load balancer pools which appear later in horizon's admin project
+      LP: 1244126
+    - [5520d65] create volume option is shown, even without cinder enabled
+      LP: 1267438
+    - [5b970a5] .tx/config in havana needs to catch up with Transifex resource
+      renaming LP: 1274005
+    - [6508afd] when creating instance,access security and networking tabs
+      missing asterisk LP: 1252005
+    - [96bd650] timeout logic causes logout when load balanced LP: 1243277
+    - [36e0ab5] Import translations for Havana 2013.2.2 update
+
+  [ James Page ]
+  * d/static/*: Refreshed for new upstream release.
+
+ -- Chuck Short <zulcss@ubuntu.com>  Tue, 25 Feb 2014 09:19:08 -0500
+
+horizon (1:2013.2.1-0ubuntu1) saucy-proposed; urgency=low
+
+  * Resynchronize with stable/havana (9668e80) (LP: #1262788):
+    - [d97bba1] precision of floating point metering stats is discarded
+      unnecessarily LP: 1241467
+    - [53047be] "Tenant" should be "Project" (Resource Usage panel) LP: 1250942
+    - [728b5d1] Subnet / Subnet details not marked as translatable LP: 1254026
+    - [9465e54] missing hover hint for instance:<type> meter in Metric dropdown
+      list LP: 1243241
+    - [842ba5f] Default port for The MS SQL Security Group is 1433 instead of
+      1443 LP: 1250029
+    - [631ee65] iso8601 debug message is annoying in dashboard unit test
+      LP: 1250554
+    - [1361a02] only meters associated with the first instance reported appear
+      in Metric dropdown list LP: 1243298
+    - [599d4a5] Persistent XSS in OpenStack Web UI for Instances LP: 1247675
+    - [7f804c9] Password Change needs to logout current user  LP: 1226829
+    - [3b621e7] The "Weight" parameter in Horizon's LBaaS member creation
+      dialog is mandatory while it's only optional in the cli command
+      LP: 1241004
+    - [b5b102e] i18n: "Filter" in "Flavor Access" tab of "Create Flavor"
+      workflow is not translatable LP: 1239927
+    - [0aba596] I18n: Localization of the role "Member" LP: 1255004
+    - [d66a483] detach volume dialog contains escaped html LP: 1252881
+    - [37f0128] English string for "Injected File Path Bytes" is wrong
+      LP: 1254049
+    - [ac2815c] ./templates/base.html.c:6: warning: unterminated string literal
+      LP: 1243526
+    - [6d02f2e] Cannot assign different translations for present and past
+      message of BatchAction LP: 1252082
+    - [655dc79] Resource Usage Page table views shows statistics in a wrong way
+      LP: 1249279
+    - [5d9684d] lbaas pool tcp LP: 1241713
+    - [040bebb] Some "Working" dialogs are not translatable LP: 1252074
+    - [852e5c8] Translation update for 2013.2.1 release LP: 1258462
+    - [9668e80] Updated from global requirements
+  * debian/patches/CVE-2013-6406: Dropped, applied upstream [599d4a5]
+  * debian/patches/revert-stable-havana-requirements.patch: Revert
+    version bumps to dependencies in stable/havana back to what was
+    shipped with Saucy.
+
+ -- Adam Gandelman <adamg@ubuntu.com>  Wed, 18 Dec 2013 10:47:22 -0800
+
+horizon (1:2013.2-0ubuntu1.1) saucy-security; urgency=low
+
+  * SECURITY UPDATE: XSS in Volumes and Network Topology pages
+    - debian/patches/CVE-2013-6406: html.escape() various items in
+      volumes/tables.py and volume_snapshots/tables.py
+    - CVE-2013-6406 (also referred to as CVE-2013-6858)
+    - LP: #1247675
+
+ -- Jamie Strandboge <jamie@ubuntu.com>  Tue, 03 Dec 2013 15:54:34 -0600
+
+horizon (1:2013.2-0ubuntu1) saucy; urgency=low
+
+  * New upstream release (LP: #1236462).
+
+ -- Chuck Short <zulcss@ubuntu.com>  Thu, 17 Oct 2013 09:43:46 -0400
 
 horizon (1:2013.2~rc3-0ubuntu1) saucy; urgency=low
 
index d05528fa47e53f09d6cdd7c85efe09acf19b54a5..2bfb8e382af858bca62e022edbaca433efecd6e7 100755 (executable)
@@ -58,7 +58,6 @@ if [ "$1" = "configure" ]; then
     fi
     chown -R horizon:horizon /var/lib/openstack-dashboard
   fi
-
   if [ -d /usr/share/openstack-dashboard ] ; then
     chown -R horizon:horizon /usr/share/openstack-dashboard
   fi
diff --git a/debian/patches/revert-stable-havana-requirements.patch b/debian/patches/revert-stable-havana-requirements.patch
new file mode 100644 (file)
index 0000000..f091d75
--- /dev/null
@@ -0,0 +1,13 @@
+Index: horizon/requirements.txt
+===================================================================
+--- horizon.orig/requirements.txt      2013-12-18 10:45:38.715248799 -0800
++++ horizon/requirements.txt   2013-12-18 10:46:46.763248182 -0800
+@@ -6,7 +6,7 @@
+ eventlet>=0.13.0
+ kombu>=2.4.8
+ lesscpy>=0.9j
+-iso8601>=0.1.8
++iso8601>=0.1.4
+ netaddr
+ python-cinderclient>=1.0.6
+ python-glanceclient>=0.9.0
index 813ce13c93ef2494702ec418dc7f90378ae21f7c..e0bc54f4513d4a665e6a0af40922843f4193ce60 100644 (file)
@@ -6,6 +6,6 @@ fix-dashboard-manage.patch
 
 fix-ubuntu-tests.patch
 ubuntu_settings.patch
-
+revert-stable-havana-requirements.patch
 mos-disable-metering.patch
 mos-fix-murano-savana-dashboard.patch
index bc064c14f4406a59db00d7cdd63acf923daec47f..f776e794e8a9f999fcdfe84b2aa568e599e78b01 100644 (file)
@@ -1,6 +1,8 @@
---- a/openstack_dashboard/local/local_settings.py.example
-+++ b/openstack_dashboard/local/local_settings.py.example
-@@ -4,7 +4,7 @@ from django.utils.translation import uge
+Index: horizon/openstack_dashboard/local/local_settings.py.example
+===================================================================
+--- horizon.orig/openstack_dashboard/local/local_settings.py.example   2013-12-18 10:46:15.499248466 -0800
++++ horizon/openstack_dashboard/local/local_settings.py.example        2013-12-18 10:46:15.491248466 -0800
+@@ -4,7 +4,7 @@
  
  from openstack_dashboard import exceptions
  
@@ -9,7 +11,7 @@
  TEMPLATE_DEBUG = DEBUG
  
  # Required for Django 1.5.
-@@ -89,22 +89,16 @@ LOCAL_PATH = os.path.dirname(os.path.abs
+@@ -89,22 +89,16 @@
  # requests routed to the same dashboard instance or you set the same SECRET_KEY
  # for all of them.
  from horizon.utils import secret_key
@@ -37,7 +39,7 @@
  }
  
  # Send email to the console by default
-@@ -406,3 +400,24 @@ SECURITY_GROUP_RULES = {
+@@ -448,3 +442,24 @@
          'to_port': '3389',
      },
  }
 +# installations should have this set accordingly.  For more information
 +# see https://docs.djangoproject.com/en/dev/ref/settings/.
 +ALLOWED_HOSTS = '*'
---- a/openstack_dashboard/settings.py
-+++ b/openstack_dashboard/settings.py
-@@ -217,8 +217,7 @@ if not SECRET_KEY:
+Index: horizon/openstack_dashboard/settings.py
+===================================================================
+--- horizon.orig/openstack_dashboard/settings.py       2013-12-18 10:46:15.499248466 -0800
++++ horizon/openstack_dashboard/settings.py    2013-12-18 10:46:15.491248466 -0800
+@@ -219,8 +219,7 @@
      from horizon.utils import secret_key
      LOCAL_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)),
                                'local')
similarity index 99%
rename from debian/static/openstack-dashboard/js/271a130e6a31.js
rename to debian/static/openstack-dashboard/js/59722976ae97.js
index dd375e9b3188ca67b70c8485fc0d82e50c4cb23f..f774a81a21574b4beb2c3e75857776ab5cb9d703 100644 (file)
@@ -211,8 +211,8 @@ var template=horizon.templates.compiled_templates["#alert_message_template"],par
 horizon.addInitFunction(function(){$("body").ajaxComplete(function(event,request,settings){var message_array=$.parseJSON(horizon.ajax.get_messages(request));$(message_array).each(function(index,item){horizon.alert(item[0],item[1],item[2]);});});$('a.ajax-modal').click(function(){horizon.clearAllMessages();});$(".alert").alert();horizon.autoDismissAlerts();});horizon.modals={_request:null,spinner:null,_init_functions:[]};horizon.modals.addModalInitFunction=function(f){horizon.modals._init_functions.push(f);};horizon.modals.initModal=function(modal){$(horizon.modals._init_functions).each(function(index,f){f(modal);});};horizon.modals.create=function(title,body,confirm,cancel){if(!cancel){cancel=gettext("Cancel");}
 var template=horizon.templates.compiled_templates["#modal_template"],params={title:title,body:body,confirm:confirm,cancel:cancel},modal=$(template.render(params)).appendTo("#modal_wrapper");return modal;};horizon.modals.success=function(data,textStatus,jqXHR){var modal;$('#modal_wrapper').append(data);$('.modal span.help-block').hide();modal=$('.modal:last');modal.modal();$(modal).trigger("new_modal",modal);return modal;};horizon.modals.modal_spinner=function(text){var template=horizon.templates.compiled_templates["#spinner-modal"];horizon.modals.spinner=$(template.render({text:text}));horizon.modals.spinner.appendTo("#modal_wrapper");horizon.modals.spinner.modal({backdrop:'static'});horizon.modals.spinner.spin(horizon.conf.spinner_options.modal);};horizon.addInitFunction(function(){$('#modal_wrapper').on('new_modal',function(evt,modal){horizon.modals.initModal(modal);});$(document).on('click','.modal .cancel',function(evt){$(this).closest('.modal').modal('hide');evt.preventDefault();});$(document).on('submit','.modal form',function(evt){var $form=$(this),$button=$form.find(".modal-footer .btn-primary"),update_field_id=$form.attr("data-add-to-field"),headers={};if($form.attr("enctype")==="multipart/form-data"){return;}
 evt.preventDefault();$button.prop("disabled",true);if(update_field_id){headers["X-Horizon-Add-To-Field"]=update_field_id;}
-$.ajax({type:"POST",url:$form.attr('action'),headers:headers,data:$form.serialize(),beforeSend:function(){$("#modal_wrapper .modal").last().modal("hide");horizon.modals.modal_spinner("Working");},complete:function(){horizon.modals.spinner.modal('hide');$("#modal_wrapper .modal").last().modal("show");$button.prop("disabled",false);},success:function(data,textStatus,jqXHR){var redirect_header=jqXHR.getResponseHeader("X-Horizon-Location"),add_to_field_header=jqXHR.getResponseHeader("X-Horizon-Add-To-Field"),json_data,field_to_update;$form.closest(".modal").modal("hide");if(redirect_header){location.href=redirect_header;}
-else if(add_to_field_header){json_data=$.parseJSON(data);field_to_update=$("#"+add_to_field_header);field_to_update.append("<option value='"+json_data[0]+"'>"+json_data[1]+"</option>");field_to_update.change();field_to_update.val(json_data[0]);}else{horizon.modals.success(data,textStatus,jqXHR);}},error:function(jqXHR,status,errorThrown){$form.closest(".modal").modal("hide");horizon.alert("error",gettext("There was an error submitting the form. Please try again."));}});});$(document).on('show','.modal',function(evt){if($(evt.target).hasClass("modal")){var scrollShift=$('body').scrollTop(),$this=$(this),topVal=$this.css('top');$this.css('top',scrollShift+parseInt(topVal,10));}});horizon.modals.addModalInitFunction(function(modal){$(modal).find(":text, select, textarea").filter(":visible:first").focus();});horizon.modals.addModalInitFunction(horizon.datatables.validate_button);$(document).on('click','.ajax-modal',function(evt){var $this=$(this);if(horizon.modals._request&&typeof(horizon.modals._request.abort)!==undefined){horizon.modals._request.abort();}
+$.ajax({type:"POST",url:$form.attr('action'),headers:headers,data:$form.serialize(),beforeSend:function(){$("#modal_wrapper .modal").last().modal("hide");horizon.modals.modal_spinner(gettext("Working"));},complete:function(){horizon.modals.spinner.modal('hide');$("#modal_wrapper .modal").last().modal("show");$button.prop("disabled",false);},success:function(data,textStatus,jqXHR){var redirect_header=jqXHR.getResponseHeader("X-Horizon-Location"),add_to_field_header=jqXHR.getResponseHeader("X-Horizon-Add-To-Field"),json_data,field_to_update;$form.closest(".modal").modal("hide");if(redirect_header){location.href=redirect_header;}
+else if(add_to_field_header){json_data=$.parseJSON(data);field_to_update=$("#"+add_to_field_header);field_to_update.append("<option value='"+json_data[0]+"'>"+json_data[1]+"</option>");field_to_update.change();field_to_update.val(json_data[0]);}else{horizon.modals.success(data,textStatus,jqXHR);}},error:function(jqXHR,status,errorThrown){if(jqXHR.getResponseHeader('logout')){location.href=jqXHR.getResponseHeader("X-Horizon-Location");}else{$form.closest(".modal").modal("hide");horizon.alert("error",gettext("There was an error submitting the form. Please try again."));}}});});$(document).on('show','.modal',function(evt){if($(evt.target).hasClass("modal")){var scrollShift=$('body').scrollTop()||$('html').scrollTop(),$this=$(this),topVal=$this.css('top');$this.css('top',scrollShift+parseInt(topVal,10));}});horizon.modals.addModalInitFunction(function(modal){$(modal).find(":text, select, textarea").filter(":visible:first").focus();});horizon.modals.addModalInitFunction(horizon.datatables.validate_button);$(document).on('click','.ajax-modal',function(evt){var $this=$(this);if(horizon.modals._request&&typeof(horizon.modals._request.abort)!==undefined){horizon.modals._request.abort();}
 horizon.modals._request=$.ajax($this.attr('href'),{beforeSend:function(){horizon.modals.modal_spinner(gettext("Loading"));},complete:function(){horizon.modals._request=null;horizon.modals.spinner.modal('hide');},error:function(jqXHR,status,errorThrown){if(jqXHR.status===401){var redir_url=jqXHR.getResponseHeader("X-Horizon-Location");if(redir_url){location.href=redir_url;}else{location.reload(true);}}
 else{if(!horizon.ajax.get_messages(jqXHR)){horizon.alert("error",gettext("An error occurred. Please try again later."));}}},success:function(data,textStatus,jqXHR){var update_field_id=$this.attr('data-add-to-field'),modal,form;modal=horizon.modals.success(data,textStatus,jqXHR);if(update_field_id){form=modal.find("form");if(form.length){form.attr("data-add-to-field",update_field_id);}}}});evt.preventDefault();});$(document).on("show",".modal",function(){var container=$("#modal_wrapper"),modal_stack=container.find(".modal"),$this=$(this);modal_stack.splice(modal_stack.length-1,1);modal_stack.modal("hide");});$(document).on('hidden','.modal',function(){var $this=$(this),modal_stack=$("#modal_wrapper .modal");if($this[0]==modal_stack.last()[0]||$this.hasClass("loading")){$this.remove();if(!$this.hasClass("loading")){$("#modal_wrapper .modal").last().modal("show");}}});});horizon.Quota={is_flavor_quota:false,user_value_progress_bars:[],auto_value_progress_bars:[],flavor_progress_bars:[],user_value_form_inputs:[],selected_flavor:null,flavors:[],init:function(){this.user_value_progress_bars=$('div[data-progress-indicator-for]');this.auto_value_progress_bars=$('div[data-progress-indicator-step-by]');this.user_value_form_inputs=$($.map(this.user_value_progress_bars,function(elm){return('#'+$(elm).attr('data-progress-indicator-for'));}));this._initialCreation(this.user_value_progress_bars)
 this._initialCreation(this.auto_value_progress_bars)
@@ -462,7 +462,7 @@ self.color=d3.scale.category20();self.load_settings=function(settings){self.sett
 self.get_size=function(){$(self.html_element).css("height","");$(self.html_element).css("width","");var svg=$(self.html_element).find("svg");svg.hide();self.width=jquery_element.width();self.height=jquery_element.height();if(self.settings.auto_size){var auto_height=$(window).height()-jquery_element.offset().top-30;if(auto_height>self.height){self.height=auto_height;}}
 $(self.html_element).css("height",self.height);$(self.html_element).css("width",self.width);svg.show();svg.css("height",self.height);svg.css("width",self.width);}
 self.load_settings({});self.get_size();self.refresh=function(){var self=this;self.start_loading();horizon.ajax.queue({url:self.final_url,success:function(data,textStatus,jqXHR){$(self.html_element).html("");$(self.legend_element).html("");self.series=data.series;self.load_settings(data.settings);if(self.series.length<=0){$(self.html_element).html("No data available.");$(self.legend_element).html("");$(self.legend_element).css("height","");}else{self.render();}},error:function(jqXHR,textStatus,errorThrown){$(self.html_element).html("No data available.");$(self.legend_element).html("");$(self.legend_element).css("height","");horizon.alert("error",gettext("An error occurred. Please try again later."));},complete:function(jqXHR,textStatus){self.finish_loading();}});};self.render=function(){var self=this;$.map(self.series,function(serie){serie.color=self.color(serie.name)
-$.map(serie.data,function(statistic){statistic.x=d3.time.format("%Y-%m-%dT%H:%M:%S").parse(statistic.x);statistic.x=statistic.x.getTime()/1000;});});var graph=new Rickshaw.Graph({element:self.html_element,width:self.width,height:self.height,renderer:self.settings.renderer,series:self.series});graph.render();var hoverDetail=new Rickshaw.Graph.HoverDetail({graph:graph,formatter:function(series,x,y){var date='<span class="date">'+new Date(x*1000).toUTCString()+'</span>';var swatch='<span class="detail_swatch" style="background-color: '+series.color+'"></span>';var content=swatch+series.name+": "+parseInt(y)+" "+series.unit+'<br>'+date;return content;}});if(self.legend_element){var legend=new Rickshaw.Graph.Legend({graph:graph,element:self.legend_element});var shelving=new Rickshaw.Graph.Behavior.Series.Toggle({graph:graph,legend:legend});var order=new Rickshaw.Graph.Behavior.Series.Order({graph:graph,legend:legend});var highlighter=new Rickshaw.Graph.Behavior.Series.Highlight({graph:graph,legend:legend});}
+$.map(serie.data,function(statistic){statistic.x=d3.time.format("%Y-%m-%dT%H:%M:%S").parse(statistic.x);statistic.x=statistic.x.getTime()/1000;});});var graph=new Rickshaw.Graph({element:self.html_element,width:self.width,height:self.height,renderer:self.settings.renderer,series:self.series});graph.render();var hoverDetail=new Rickshaw.Graph.HoverDetail({graph:graph,formatter:function(series,x,y){var date='<span class="date">'+new Date(x*1000).toUTCString()+'</span>';var swatch='<span class="detail_swatch" style="background-color: '+series.color+'"></span>';var content=swatch+series.name+": "+parseFloat(y).toFixed(2)+" "+series.unit+'<br>'+date;return content;}});if(self.legend_element){var legend=new Rickshaw.Graph.Legend({graph:graph,element:self.legend_element});var shelving=new Rickshaw.Graph.Behavior.Series.Toggle({graph:graph,legend:legend});var order=new Rickshaw.Graph.Behavior.Series.Order({graph:graph,legend:legend});var highlighter=new Rickshaw.Graph.Behavior.Series.Highlight({graph:graph,legend:legend});}
 var axes_x=new Rickshaw.Graph.Axis.Time({graph:graph});axes_x.render();var axes_y=new Rickshaw.Graph.Axis.Y({graph:graph});axes_y.render();$(self.legend_element).css("height","");};self.start_loading=function(){var self=this;$(self.html_element).find(".modal-backdrop").remove();$(self.html_element).find(".spinner_wrapper").remove();self.backdrop=$("<div class='modal-backdrop'></div>");self.backdrop.css("width",self.width).css("height",self.height);$(self.html_element).append(self.backdrop);$(self.legend_element).html("").addClass("disabled");self.spinner=$("<div class='spinner_wrapper'></div>");$(self.html_element).append(self.spinner);self.spinner.spin(horizon.conf.spinner_options.line_chart);var radius=horizon.conf.spinner_options.line_chart.radius;var length=horizon.conf.spinner_options.line_chart.length;var spinner_size=radius+length;var top=(self.height/2)-spinner_size/2;var left=(self.width/2)-spinner_size/2;self.spinner.css("top",top).css("left",left);};self.finish_loading=function(){var self=this;$(self.legend_element).removeClass("disabled");};},init:function(selector,settings){var self=this;$(selector).each(function(){self.refresh(this);});var rtime=new Date(1,1,2000,12,00,00);var timeout=false;var delta=400;$(window).resize(function(){rtime=new Date();if(timeout===false){timeout=true;setTimeout(resizeend,delta);}});function resizeend(){if(new Date()-rtime<delta){setTimeout(resizeend,delta);}else{timeout=false;$(selector).each(function(){self.refresh(this);});}}
 self.bind_commands(selector);},refresh:function(html_element){var chart=new this.LineChart(this,html_element)
 chart.refresh();},bind_commands:function(selector){var select_box_selector='select[data-line-chart-command="select_box_change"]';var datepicker_selector='input[data-line-chart-command="date_picker_change"]';var self=this;connect_forms_to_charts=function(){$(selector).each(function(){var chart=$(this);$(chart.data('form-selector')).each(function(){var form=$(this);var chart_identifier='div[data-form-selector="'+chart.data('form-selector')+'"]';if(!form.data("charts_selector")){form.data("charts_selector",chart_identifier);}else{form.data("charts_selector",form.data("charts_selector")+", "+chart_identifier);}});});};delegate_event_and_refresh_charts=function(selector,event_name){$("form").delegate(selector,event_name,function(){var invoker=$(this);var form=invoker.parents("form").first();$(form.data("charts_selector")).each(function(){self.refresh(this);});});};bind_select_box_change=function(){delegate_event_and_refresh_charts(select_box_selector,"change");};bind_datepicker_change=function(){var now=new Date();$(datepicker_selector).each(function(){var el=$(this);el.datepicker({format:"yyyy-mm-dd",setDate:new Date(),showButtonPanel:true})});delegate_event_and_refresh_charts(datepicker_selector,"changeDate");};connect_forms_to_charts();bind_select_box_change();bind_datepicker_change();}}
index 59345e8f02274cecc69e3ce7681fa55ce0b0aeff..ce595cc9468b6a9bf5c5918879dd04dfd18a67f0 100644 (file)
@@ -1,5 +1,5 @@
 {
-  "31e68b3a0f4dc1c7b2874c30d74a6c5f": "<script type=\"text/javascript\" src=\"/static/dashboard/js/588884c5a22a.js\"></script>",
-  "fa1e37f67ab85248c0eeab1040fd5b0f": "<script type=\"text/javascript\" src=\"/static/dashboard/js/271a130e6a31.js\"></script>",
-  "cd3f60d28370bf68dc0658c05abae046": "<link rel=\"stylesheet\" href=\"/static/dashboard/css/d46048c6478b.css\" type=\"text/css\" media=\"screen\" />"
+  "cd3f60d28370bf68dc0658c05abae046": "<link rel=\"stylesheet\" href=\"/static/dashboard/css/d46048c6478b.css\" type=\"text/css\" media=\"screen\" />",
+  "fa1e37f67ab85248c0eeab1040fd5b0f": "<script type=\"text/javascript\" src=\"/static/dashboard/js/59722976ae97.js\"></script>",
+  "31e68b3a0f4dc1c7b2874c30d74a6c5f": "<script type=\"text/javascript\" src=\"/static/dashboard/js/588884c5a22a.js\"></script>"
 }
\ No newline at end of file
index 2a53c0f71356c604d14d718ac81baac3d7cd3dbc..b3c01add741c03af3273bf6c0f0e1d529f5f897e 100644 (file)
@@ -1,4 +1,4 @@
-From 7e42671c5b9c190191ba5044b63e750824742ffa Mon Sep 17 00:00:00 2001
+From f945b999b097f74783b910175d004579ca8e4919 Mon Sep 17 00:00:00 2001
 From: Matthias Runge <mrunge@redhat.com>
 Date: Fri, 5 Apr 2013 10:16:19 +0200
 Subject: [PATCH] Don't access the net while building docs (Note this hasn't
index 9e3b8c67062ba6727fd4ed74beb69048746fce4a..a020b9ce8f92342c34859f859409afba0c75580d 100644 (file)
@@ -1,4 +1,4 @@
-From 9627a3e4df39cf243e889599298e70bfa48bd4fe Mon Sep 17 00:00:00 2001
+From 4259ab6b64ae1fc6f5f14664fad981781e4280e3 Mon Sep 17 00:00:00 2001
 From: Matthias Runge <mrunge@redhat.com>
 Date: Fri, 5 Apr 2013 10:07:53 +0200
 Subject: [PATCH] disable debug, move web root
@@ -9,7 +9,7 @@ Subject: [PATCH] disable debug, move web root
  2 files changed, 12 insertions(+), 6 deletions(-)
 
 diff --git a/openstack_dashboard/local/local_settings.py.example b/openstack_dashboard/local/local_settings.py.example
-index 6e426c9..d2db3cd 100644
+index a1a8474..8f15a64 100644
 --- a/openstack_dashboard/local/local_settings.py.example
 +++ b/openstack_dashboard/local/local_settings.py.example
 @@ -4,7 +4,7 @@ from django.utils.translation import ugettext_lazy as _
index a1ba7adda1d38bd31cac5f00e015fe12730e60e1..67303f0f3b23176a7cc018537870b165b0ce6bb7 100644 (file)
@@ -1,4 +1,4 @@
-From ff59c0877d17ae0f64e83cd4af930df56182299e Mon Sep 17 00:00:00 2001
+From f4bde71afb9b9ece56eed607061937f3d261c383 Mon Sep 17 00:00:00 2001
 From: Matthias Runge <mrunge@redhat.com>
 Date: Thu, 25 Jul 2013 11:32:38 +0200
 Subject: [PATCH] change lockfile location to '/tmp' and also add localhost to
@@ -9,7 +9,7 @@ Subject: [PATCH] change lockfile location to '/tmp' and also add localhost to
  1 file changed, 2 insertions(+), 2 deletions(-)
 
 diff --git a/openstack_dashboard/local/local_settings.py.example b/openstack_dashboard/local/local_settings.py.example
-index d2db3cd..d386d46 100644
+index 8f15a64..832358e 100644
 --- a/openstack_dashboard/local/local_settings.py.example
 +++ b/openstack_dashboard/local/local_settings.py.example
 @@ -12,7 +12,7 @@ TEMPLATE_DEBUG = DEBUG
index 2a6daee5db4113ce06517ad695689b5fde20d26f..fa1c4598ea837a27e89b94ce4a80256213c53d9f 100644 (file)
@@ -1,4 +1,4 @@
-From 2b983d9b083c2ae9f09a535f64617ec3a3b02cfb Mon Sep 17 00:00:00 2001
+From 33218f8ba3ba47209b92ffd5c5bdf7fdce9ae926 Mon Sep 17 00:00:00 2001
 From: Matthias Runge <mrunge@redhat.com>
 Date: Thu, 14 Feb 2013 12:55:54 +0100
 Subject: [PATCH] Add a customization module based on RHOS
@@ -7,17 +7,21 @@ Change-Id: I8622ffc8e31cf553315077070b2a696de1bd5081
 
 Conflicts:
        openstack_dashboard/settings.py
+
+fix up issues with customization
+
+do not truncate the logo (related rhbz 877138)
 ---
  openstack_dashboard/settings.py                    | 12 ++++-
- openstack_dashboard_theme/__init__.py              |  0
- openstack_dashboard_theme/models.py                |  0
+ openstack_dashboard_theme/__init__.py              |  1 +
+ openstack_dashboard_theme/models.py                |  1 +
  .../static/dashboard/less/rhtheme.less             | 55 ++++++++++++++++++++++
  .../templates/_stylesheets.html                    |  7 +++
  .../templates/auth/_login.html                     | 29 ++++++++++++
  .../templates/auth/login.html                      | 10 ++++
- .../templates/horizon/common/_sidebar.html         | 35 ++++++++++++++
+ .../templates/horizon/common/_sidebar.html         | 54 +++++++++++++++++++++
  openstack_dashboard_theme/templates/splash.html    | 17 +++++++
- 9 files changed, 163 insertions(+), 2 deletions(-)
+ 9 files changed, 184 insertions(+), 2 deletions(-)
  create mode 100644 openstack_dashboard_theme/__init__.py
  create mode 100644 openstack_dashboard_theme/models.py
  create mode 100644 openstack_dashboard_theme/static/dashboard/less/rhtheme.less
@@ -65,17 +69,25 @@ index 84da859..cc40815 100644
  MESSAGE_STORAGE = 'django.contrib.messages.storage.cookie.CookieStorage'
 diff --git a/openstack_dashboard_theme/__init__.py b/openstack_dashboard_theme/__init__.py
 new file mode 100644
-index 0000000..e69de29
+index 0000000..94456ab
+--- /dev/null
++++ b/openstack_dashboard_theme/__init__.py
+@@ -0,0 +1 @@
++# intentionally left blank
 diff --git a/openstack_dashboard_theme/models.py b/openstack_dashboard_theme/models.py
 new file mode 100644
-index 0000000..e69de29
+index 0000000..94456ab
+--- /dev/null
++++ b/openstack_dashboard_theme/models.py
+@@ -0,0 +1 @@
++# intentionally left blank
 diff --git a/openstack_dashboard_theme/static/dashboard/less/rhtheme.less b/openstack_dashboard_theme/static/dashboard/less/rhtheme.less
 new file mode 100644
-index 0000000..5350db3
+index 0000000..d70852e
 --- /dev/null
 +++ b/openstack_dashboard_theme/static/dashboard/less/rhtheme.less
 @@ -0,0 +1,55 @@
-+@import "/static/dashboard/less/horizon.less";
++@import "horizon.less";
 +
 +/* Login Splash Page */
 +
@@ -123,10 +135,10 @@ index 0000000..5350db3
 +    background: url(/static/dashboard/img/rh-logo.png) top left no-repeat;
 +    display: block;
 +    float: left;
-+    width: 116px;
++    width: 123px;
 +    height: 123px;
 +    text-indent: -9999px;
-+    margin-left: 56px;
++    margin-left: 53px;
 +    margin-top: 15px;
 +    margin-bottom: 25px;
 +}
@@ -196,14 +208,15 @@ index 0000000..6fa7746
 +{% endblock %}
 diff --git a/openstack_dashboard_theme/templates/horizon/common/_sidebar.html b/openstack_dashboard_theme/templates/horizon/common/_sidebar.html
 new file mode 100644
-index 0000000..5672846
+index 0000000..df66c62
 --- /dev/null
 +++ b/openstack_dashboard_theme/templates/horizon/common/_sidebar.html
-@@ -0,0 +1,35 @@
+@@ -0,0 +1,54 @@
 +{% load branding horizon i18n %}
++{% load url from future %}
 +
 +<div class='sidebar'>
-+  <h1 class="rhos clearfix"><a href="{% url horizon:user_home %}">{% site_branding %}</a></h1>
++  <h1 class="rhos clearfix"><a href="{% url 'horizon:user_home' %}">{% site_branding %}</a></h1>
 +
 +  {% horizon_main_nav %}
 +
@@ -224,7 +237,7 @@ index 0000000..5672846
 +          <li class='divider'></li>
 +          {% for tenant in authorized_tenants %}
 +            {% if tenant.enabled and tenant.id != request.user.tenant_id %}
-+              <li><a href="{% url switch_tenants tenant.id %}">{{ tenant.name }}</a></li>
++              <li><a href="{% url 'switch_tenants' tenant.id %}?next={{ request.horizon.dashboard.get_absolute_url }}">{{ tenant.name }}</a></li>
 +            {% endif %}
 +          {% endfor %}
 +        </ul>
@@ -233,6 +246,24 @@ index 0000000..5672846
 +  </div>
 +  {% endif %}
 +
++  {% with num_of_regions=request.user.available_services_regions|length %}
++  {% if num_of_regions > 1 %}
++  <div id="services_region_switcher" class="dropdown switcher_bar" tabindex="1">
++    <a class="dropdown-toggle" data-toggle="dropdown" href="#services_region_switcher">
++        <h4>{% trans "Managing Region" %}</h4>
++        <h3>{{ request.user.services_region }}</h3>
++    </a>
++
++    <ul id="services_regions_list" class="dropdown-menu">
++        <li class='divider'></li>
++        {% for region in request.user.available_services_regions %}
++        <li><a href="{% url 'switch_services_region' region %}?next={{ request.horizon.panel.get_absolute_url }}">{{ region }}</a></li>
++        {% endfor %}
++    </ul>
++  </div>
++  {% endif %}
++  {% endwith %}
++
 +  {% horizon_dashboard_nav %}
 +</div>
 diff --git a/openstack_dashboard_theme/templates/splash.html b/openstack_dashboard_theme/templates/splash.html
diff --git a/rpm/SOURCES/0005-Revert-Use-oslo.sphinx-and-remove-local-copy-of-doc-.patch b/rpm/SOURCES/0005-Revert-Use-oslo.sphinx-and-remove-local-copy-of-doc-.patch
deleted file mode 100644 (file)
index 94740bb..0000000
+++ /dev/null
@@ -1,1348 +0,0 @@
-From 9058dd457bf4ce116848c48cc9fdcd0319e77e84 Mon Sep 17 00:00:00 2001
-From: Matthias Runge <mrunge@redhat.com>
-Date: Mon, 9 Sep 2013 13:51:19 +0200
-Subject: [PATCH] Revert "Use oslo.sphinx and remove local copy of doc theme"
-
-This reverts commit b6f7d8318bf909cc9989809127fc108e405fa400.
----
- doc/source/_static/.gitignore      |   0
- doc/source/_static/basic.css       | 416 +++++++++++++++++++++++++++++++++++++
- doc/source/_static/default.css     | 230 ++++++++++++++++++++
- doc/source/_static/jquery.tweet.js | 154 ++++++++++++++
- doc/source/_static/nature.css      | 245 ++++++++++++++++++++++
- doc/source/_static/tweaks.css      |  95 +++++++++
- doc/source/_templates/.placeholder |   0
- doc/source/_theme/layout.html      |  83 ++++++++
- doc/source/_theme/theme.conf       |   4 +
- doc/source/conf.py                 |  13 +-
- test-requirements.txt              |   1 -
- 11 files changed, 1234 insertions(+), 7 deletions(-)
- create mode 100644 doc/source/_static/.gitignore
- create mode 100644 doc/source/_static/basic.css
- create mode 100644 doc/source/_static/default.css
- create mode 100644 doc/source/_static/jquery.tweet.js
- create mode 100644 doc/source/_static/nature.css
- create mode 100644 doc/source/_static/tweaks.css
- create mode 100644 doc/source/_templates/.placeholder
- create mode 100644 doc/source/_theme/layout.html
- create mode 100644 doc/source/_theme/theme.conf
-
-diff --git a/doc/source/_static/.gitignore b/doc/source/_static/.gitignore
-new file mode 100644
-index 0000000..e69de29
-diff --git a/doc/source/_static/basic.css b/doc/source/_static/basic.css
-new file mode 100644
-index 0000000..d909ce3
---- /dev/null
-+++ b/doc/source/_static/basic.css
-@@ -0,0 +1,416 @@
-+/**
-+ * Sphinx stylesheet -- basic theme
-+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-+ */
-+
-+/* -- main layout ----------------------------------------------------------- */
-+
-+div.clearer {
-+    clear: both;
-+}
-+
-+/* -- relbar ---------------------------------------------------------------- */
-+
-+div.related {
-+    width: 100%;
-+    font-size: 90%;
-+}
-+
-+div.related h3 {
-+    display: none;
-+}
-+
-+div.related ul {
-+    margin: 0;
-+    padding: 0 0 0 10px;
-+    list-style: none;
-+}
-+
-+div.related li {
-+    display: inline;
-+}
-+
-+div.related li.right {
-+    float: right;
-+    margin-right: 5px;
-+}
-+
-+/* -- sidebar --------------------------------------------------------------- */
-+
-+div.sphinxsidebarwrapper {
-+    padding: 10px 5px 0 10px;
-+}
-+
-+div.sphinxsidebar {
-+    float: left;
-+    width: 230px;
-+    margin-left: -100%;
-+    font-size: 90%;
-+}
-+
-+div.sphinxsidebar ul {
-+    list-style: none;
-+}
-+
-+div.sphinxsidebar ul ul,
-+div.sphinxsidebar ul.want-points {
-+    margin-left: 20px;
-+    list-style: square;
-+}
-+
-+div.sphinxsidebar ul ul {
-+    margin-top: 0;
-+    margin-bottom: 0;
-+}
-+
-+div.sphinxsidebar form {
-+    margin-top: 10px;
-+}
-+
-+div.sphinxsidebar input {
-+    border: 1px solid #98dbcc;
-+    font-family: sans-serif;
-+    font-size: 1em;
-+}
-+
-+img {
-+    border: 0;
-+}
-+
-+/* -- search page ----------------------------------------------------------- */
-+
-+ul.search {
-+    margin: 10px 0 0 20px;
-+    padding: 0;
-+}
-+
-+ul.search li {
-+    padding: 5px 0 5px 20px;
-+    background-image: url(file.png);
-+    background-repeat: no-repeat;
-+    background-position: 0 7px;
-+}
-+
-+ul.search li a {
-+    font-weight: bold;
-+}
-+
-+ul.search li div.context {
-+    color: #888;
-+    margin: 2px 0 0 30px;
-+    text-align: left;
-+}
-+
-+ul.keywordmatches li.goodmatch a {
-+    font-weight: bold;
-+}
-+
-+/* -- index page ------------------------------------------------------------ */
-+
-+table.contentstable {
-+    width: 90%;
-+}
-+
-+table.contentstable p.biglink {
-+    line-height: 150%;
-+}
-+
-+a.biglink {
-+    font-size: 1.3em;
-+}
-+
-+span.linkdescr {
-+    font-style: italic;
-+    padding-top: 5px;
-+    font-size: 90%;
-+}
-+
-+/* -- general index --------------------------------------------------------- */
-+
-+table.indextable td {
-+    text-align: left;
-+    vertical-align: top;
-+}
-+
-+table.indextable dl, table.indextable dd {
-+    margin-top: 0;
-+    margin-bottom: 0;
-+}
-+
-+table.indextable tr.pcap {
-+    height: 10px;
-+}
-+
-+table.indextable tr.cap {
-+    margin-top: 10px;
-+    background-color: #f2f2f2;
-+}
-+
-+img.toggler {
-+    margin-right: 3px;
-+    margin-top: 3px;
-+    cursor: pointer;
-+}
-+
-+/* -- general body styles --------------------------------------------------- */
-+
-+a.headerlink {
-+    visibility: hidden;
-+}
-+
-+h1:hover > a.headerlink,
-+h2:hover > a.headerlink,
-+h3:hover > a.headerlink,
-+h4:hover > a.headerlink,
-+h5:hover > a.headerlink,
-+h6:hover > a.headerlink,
-+dt:hover > a.headerlink {
-+    visibility: visible;
-+}
-+
-+div.body p.caption {
-+    text-align: inherit;
-+}
-+
-+div.body td {
-+    text-align: left;
-+}
-+
-+.field-list ul {
-+    padding-left: 1em;
-+}
-+
-+.first {
-+}
-+
-+p.rubric {
-+    margin-top: 30px;
-+    font-weight: bold;
-+}
-+
-+/* -- sidebars -------------------------------------------------------------- */
-+
-+div.sidebar {
-+    margin: 0 0 0.5em 1em;
-+    border: 1px solid #ddb;
-+    padding: 7px 7px 0 7px;
-+    background-color: #ffe;
-+    width: 40%;
-+    float: right;
-+}
-+
-+p.sidebar-title {
-+    font-weight: bold;
-+}
-+
-+/* -- topics ---------------------------------------------------------------- */
-+
-+div.topic {
-+    border: 1px solid #ccc;
-+    padding: 7px 7px 0 7px;
-+    margin: 10px 0 10px 0;
-+}
-+
-+p.topic-title {
-+    font-size: 1.1em;
-+    font-weight: bold;
-+    margin-top: 10px;
-+}
-+
-+/* -- admonitions ----------------------------------------------------------- */
-+
-+div.admonition {
-+    margin-top: 10px;
-+    margin-bottom: 10px;
-+    padding: 7px;
-+}
-+
-+div.admonition dt {
-+    font-weight: bold;
-+}
-+
-+div.admonition dl {
-+    margin-bottom: 0;
-+}
-+
-+p.admonition-title {
-+    margin: 0px 10px 5px 0px;
-+    font-weight: bold;
-+}
-+
-+div.body p.centered {
-+    text-align: center;
-+    margin-top: 25px;
-+}
-+
-+/* -- tables ---------------------------------------------------------------- */
-+
-+table.docutils {
-+    border: 0;
-+    border-collapse: collapse;
-+}
-+
-+table.docutils td, table.docutils th {
-+    padding: 1px 8px 1px 0;
-+    border-top: 0;
-+    border-left: 0;
-+    border-right: 0;
-+    border-bottom: 1px solid #aaa;
-+}
-+
-+table.field-list td, table.field-list th {
-+    border: 0 !important;
-+}
-+
-+table.footnote td, table.footnote th {
-+    border: 0 !important;
-+}
-+
-+th {
-+    text-align: left;
-+    padding-right: 5px;
-+}
-+
-+/* -- other body styles ----------------------------------------------------- */
-+
-+dl {
-+    margin-bottom: 15px;
-+}
-+
-+dd p {
-+    margin-top: 0px;
-+}
-+
-+dd ul, dd table {
-+    margin-bottom: 10px;
-+}
-+
-+dd {
-+    margin-top: 3px;
-+    margin-bottom: 10px;
-+    margin-left: 30px;
-+}
-+
-+dt:target, .highlight {
-+    background-color: #fbe54e;
-+}
-+
-+dl.glossary dt {
-+    font-weight: bold;
-+    font-size: 1.1em;
-+}
-+
-+.field-list ul {
-+    margin: 0;
-+    padding-left: 1em;
-+}
-+
-+.field-list p {
-+    margin: 0;
-+}
-+
-+.refcount {
-+    color: #060;
-+}
-+
-+.optional {
-+    font-size: 1.3em;
-+}
-+
-+.versionmodified {
-+    font-style: italic;
-+}
-+
-+.system-message {
-+    background-color: #fda;
-+    padding: 5px;
-+    border: 3px solid red;
-+}
-+
-+.footnote:target  {
-+    background-color: #ffa
-+}
-+
-+.line-block {
-+    display: block;
-+    margin-top: 1em;
-+    margin-bottom: 1em;
-+}
-+
-+.line-block .line-block {
-+    margin-top: 0;
-+    margin-bottom: 0;
-+    margin-left: 1.5em;
-+}
-+
-+/* -- code displays --------------------------------------------------------- */
-+
-+pre {
-+    overflow: auto;
-+}
-+
-+td.linenos pre {
-+    padding: 5px 0px;
-+    border: 0;
-+    background-color: transparent;
-+    color: #aaa;
-+}
-+
-+table.highlighttable {
-+    margin-left: 0.5em;
-+}
-+
-+table.highlighttable td {
-+    padding: 0 0.5em 0 0.5em;
-+}
-+
-+tt.descname {
-+    background-color: transparent;
-+    font-weight: bold;
-+    font-size: 1.2em;
-+}
-+
-+tt.descclassname {
-+    background-color: transparent;
-+}
-+
-+tt.xref, a tt {
-+    background-color: transparent;
-+    font-weight: bold;
-+}
-+
-+h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
-+    background-color: transparent;
-+}
-+
-+/* -- math display ---------------------------------------------------------- */
-+
-+img.math {
-+    vertical-align: middle;
-+}
-+
-+div.body div.math p {
-+    text-align: center;
-+}
-+
-+span.eqno {
-+    float: right;
-+}
-+
-+/* -- printout stylesheet --------------------------------------------------- */
-+
-+@media print {
-+    div.document,
-+    div.documentwrapper,
-+    div.bodywrapper {
-+        margin: 0 !important;
-+        width: 100%;
-+    }
-+
-+    div.sphinxsidebar,
-+    div.related,
-+    div.footer,
-+    #top-link {
-+        display: none;
-+    }
-+}
-diff --git a/doc/source/_static/default.css b/doc/source/_static/default.css
-new file mode 100644
-index 0000000..c8091ec
---- /dev/null
-+++ b/doc/source/_static/default.css
-@@ -0,0 +1,230 @@
-+/**
-+ * Sphinx stylesheet -- default theme
-+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-+ */
-+
-+@import url("basic.css");
-+
-+/* -- page layout ----------------------------------------------------------- */
-+
-+body {
-+    font-family: sans-serif;
-+    font-size: 100%;
-+    background-color: #11303d;
-+    color: #000;
-+    margin: 0;
-+    padding: 0;
-+}
-+
-+div.document {
-+    background-color: #1c4e63;
-+}
-+
-+div.documentwrapper {
-+    float: left;
-+    width: 100%;
-+}
-+
-+div.bodywrapper {
-+    margin: 0 0 0 230px;
-+}
-+
-+div.body {
-+    background-color: #ffffff;
-+    color: #000000;
-+    padding: 0 20px 30px 20px;
-+}
-+
-+div.footer {
-+    color: #ffffff;
-+    width: 100%;
-+    padding: 9px 0 9px 0;
-+    text-align: center;
-+    font-size: 75%;
-+}
-+
-+div.footer a {
-+    color: #ffffff;
-+    text-decoration: underline;
-+}
-+
-+div.related {
-+    background-color: #133f52;
-+    line-height: 30px;
-+    color: #ffffff;
-+}
-+
-+div.related a {
-+    color: #ffffff;
-+}
-+
-+div.sphinxsidebar {
-+}
-+
-+div.sphinxsidebar h3 {
-+    font-family: 'Trebuchet MS', sans-serif;
-+    color: #ffffff;
-+    font-size: 1.4em;
-+    font-weight: normal;
-+    margin: 0;
-+    padding: 0;
-+}
-+
-+div.sphinxsidebar h3 a {
-+    color: #ffffff;
-+}
-+
-+div.sphinxsidebar h4 {
-+    font-family: 'Trebuchet MS', sans-serif;
-+    color: #ffffff;
-+    font-size: 1.3em;
-+    font-weight: normal;
-+    margin: 5px 0 0 0;
-+    padding: 0;
-+}
-+
-+div.sphinxsidebar p {
-+    color: #ffffff;
-+}
-+
-+div.sphinxsidebar p.topless {
-+    margin: 5px 10px 10px 10px;
-+}
-+
-+div.sphinxsidebar ul {
-+    margin: 10px;
-+    padding: 0;
-+    color: #ffffff;
-+}
-+
-+div.sphinxsidebar a {
-+    color: #98dbcc;
-+}
-+
-+div.sphinxsidebar input {
-+    border: 1px solid #98dbcc;
-+    font-family: sans-serif;
-+    font-size: 1em;
-+}
-+
-+/* -- body styles ----------------------------------------------------------- */
-+
-+a {
-+    color: #355f7c;
-+    text-decoration: none;
-+}
-+
-+a:hover {
-+    text-decoration: underline;
-+}
-+
-+div.body p, div.body dd, div.body li {
-+    text-align: left;
-+    line-height: 130%;
-+}
-+
-+div.body h1,
-+div.body h2,
-+div.body h3,
-+div.body h4,
-+div.body h5,
-+div.body h6 {
-+    font-family: 'Trebuchet MS', sans-serif;
-+    background-color: #f2f2f2;
-+    font-weight: normal;
-+    color: #20435c;
-+    border-bottom: 1px solid #ccc;
-+    margin: 20px -20px 10px -20px;
-+    padding: 3px 0 3px 10px;
-+}
-+
-+div.body h1 { margin-top: 0; font-size: 200%; }
-+div.body h2 { font-size: 160%; }
-+div.body h3 { font-size: 140%; }
-+div.body h4 { font-size: 120%; }
-+div.body h5 { font-size: 110%; }
-+div.body h6 { font-size: 100%; }
-+
-+a.headerlink {
-+    color: #c60f0f;
-+    font-size: 0.8em;
-+    padding: 0 4px 0 4px;
-+    text-decoration: none;
-+}
-+
-+a.headerlink:hover {
-+    background-color: #c60f0f;
-+    color: white;
-+}
-+
-+div.body p, div.body dd, div.body li {
-+    text-align: left;
-+    line-height: 130%;
-+}
-+
-+div.admonition p.admonition-title + p {
-+    display: inline;
-+}
-+
-+div.admonition p {
-+    margin-bottom: 5px;
-+}
-+
-+div.admonition pre {
-+    margin-bottom: 5px;
-+}
-+
-+div.admonition ul, div.admonition ol {
-+    margin-bottom: 5px;
-+}
-+
-+div.note {
-+    background-color: #eee;
-+    border: 1px solid #ccc;
-+}
-+
-+div.seealso {
-+    background-color: #ffc;
-+    border: 1px solid #ff6;
-+}
-+
-+div.topic {
-+    background-color: #eee;
-+}
-+
-+div.warning {
-+    background-color: #ffe4e4;
-+    border: 1px solid #f66;
-+}
-+
-+p.admonition-title {
-+    display: inline;
-+}
-+
-+p.admonition-title:after {
-+    content: ":";
-+}
-+
-+pre {
-+    padding: 5px;
-+    background-color: #eeffcc;
-+    color: #333333;
-+    line-height: 120%;
-+    border: 1px solid #ac9;
-+    border-left: none;
-+    border-right: none;
-+}
-+
-+tt {
-+    background-color: #ecf0f3;
-+    padding: 0 1px 0 1px;
-+    font-size: 0.95em;
-+}
-+
-+.warning tt {
-+    background: #efc2c2;
-+}
-+
-+.note tt {
-+    background: #d6d6d6;
-+}
-diff --git a/doc/source/_static/jquery.tweet.js b/doc/source/_static/jquery.tweet.js
-new file mode 100644
-index 0000000..79bf0bd
---- /dev/null
-+++ b/doc/source/_static/jquery.tweet.js
-@@ -0,0 +1,154 @@
-+(function($) {
-+
-+  $.fn.tweet = function(o){
-+    var s = {
-+      username: ["seaofclouds"],              // [string]   required, unless you want to display our tweets. :) it can be an array, just do ["username1","username2","etc"]
-+      list: null,                              //[string]   optional name of list belonging to username
-+      avatar_size: null,                      // [integer]  height and width of avatar if displayed (48px max)
-+      count: 3,                               // [integer]  how many tweets to display?
-+      intro_text: null,                       // [string]   do you want text BEFORE your your tweets?
-+      outro_text: null,                       // [string]   do you want text AFTER your tweets?
-+      join_text:  null,                       // [string]   optional text in between date and tweet, try setting to "auto"
-+      auto_join_text_default: "i said,",      // [string]   auto text for non verb: "i said" bullocks
-+      auto_join_text_ed: "i",                 // [string]   auto text for past tense: "i" surfed
-+      auto_join_text_ing: "i am",             // [string]   auto tense for present tense: "i was" surfing
-+      auto_join_text_reply: "i replied to",   // [string]   auto tense for replies: "i replied to" @someone "with"
-+      auto_join_text_url: "i was looking at", // [string]   auto tense for urls: "i was looking at" http:...
-+      loading_text: null,                     // [string]   optional loading text, displayed while tweets load
-+      query: null                             // [string]   optional search query
-+    };
-+
-+    if(o) $.extend(s, o);
-+
-+    $.fn.extend({
-+      linkUrl: function() {
-+        var returning = [];
-+        var regexp = /((ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?)/gi;
-+        this.each(function() {
-+          returning.push(this.replace(regexp,"<a href=\"$1\">$1</a>"));
-+        });
-+        return $(returning);
-+      },
-+      linkUser: function() {
-+        var returning = [];
-+        var regexp = /[\@]+([A-Za-z0-9-_]+)/gi;
-+        this.each(function() {
-+          returning.push(this.replace(regexp,"<a href=\"http://twitter.com/$1\">@$1</a>"));
-+        });
-+        return $(returning);
-+      },
-+      linkHash: function() {
-+        var returning = [];
-+        var regexp = / [\#]+([A-Za-z0-9-_]+)/gi;
-+        this.each(function() {
-+          returning.push(this.replace(regexp, ' <a href="http://search.twitter.com/search?q=&tag=$1&lang=all&from='+s.username.join("%2BOR%2B")+'">#$1</a>'));
-+        });
-+        return $(returning);
-+      },
-+      capAwesome: function() {
-+        var returning = [];
-+        this.each(function() {
-+          returning.push(this.replace(/\b(awesome)\b/gi, '<span class="awesome">$1</span>'));
-+        });
-+        return $(returning);
-+      },
-+      capEpic: function() {
-+        var returning = [];
-+        this.each(function() {
-+          returning.push(this.replace(/\b(epic)\b/gi, '<span class="epic">$1</span>'));
-+        });
-+        return $(returning);
-+      },
-+      makeHeart: function() {
-+        var returning = [];
-+        this.each(function() {
-+          returning.push(this.replace(/(&lt;)+[3]/gi, "<tt class='heart'>&#x2665;</tt>"));
-+        });
-+        return $(returning);
-+      }
-+    });
-+
-+    function relative_time(time_value) {
-+      var parsed_date = Date.parse(time_value);
-+      var relative_to = (arguments.length > 1) ? arguments[1] : new Date();
-+      var delta = parseInt((relative_to.getTime() - parsed_date) / 1000);
-+      var pluralize = function (singular, n) {
-+        return '' + n + ' ' + singular + (n == 1 ? '' : 's');
-+      };
-+      if(delta < 60) {
-+      return 'less than a minute ago';
-+      } else if(delta < (45*60)) {
-+      return 'about ' + pluralize("minute", parseInt(delta / 60)) + ' ago';
-+      } else if(delta < (24*60*60)) {
-+      return 'about ' + pluralize("hour", parseInt(delta / 3600)) + ' ago';
-+      } else {
-+      return 'about ' + pluralize("day", parseInt(delta / 86400)) + ' ago';
-+      }
-+    }
-+
-+    function build_url() {
-+      var proto = ('https:' == document.location.protocol ? 'https:' : 'http:');
-+      if (s.list) {
-+        return proto+"//api.twitter.com/1/"+s.username[0]+"/lists/"+s.list+"/statuses.json?per_page="+s.count+"&callback=?";
-+      } else if (s.query == null && s.username.length == 1) {
-+        return proto+'//twitter.com/status/user_timeline/'+s.username[0]+'.json?count='+s.count+'&callback=?';
-+      } else {
-+        var query = (s.query || 'from:'+s.username.join('%20OR%20from:'));
-+        return proto+'//search.twitter.com/search.json?&q='+query+'&rpp='+s.count+'&callback=?';
-+      }
-+    }
-+
-+    return this.each(function(){
-+      var list = $('<ul class="tweet_list">').appendTo(this);
-+      var intro = '<p class="tweet_intro">'+s.intro_text+'</p>';
-+      var outro = '<p class="tweet_outro">'+s.outro_text+'</p>';
-+      var loading = $('<p class="loading">'+s.loading_text+'</p>');
-+
-+      if(typeof(s.username) == "string"){
-+        s.username = [s.username];
-+      }
-+
-+      if (s.loading_text) $(this).append(loading);
-+      $.getJSON(build_url(), function(data){
-+        if (s.loading_text) loading.remove();
-+        if (s.intro_text) list.before(intro);
-+        $.each((data.results || data), function(i,item){
-+          // auto join text based on verb tense and content
-+          if (s.join_text == "auto") {
-+            if (item.text.match(/^(@([A-Za-z0-9-_]+)) .*/i)) {
-+              var join_text = s.auto_join_text_reply;
-+            } else if (item.text.match(/(^\w+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+) .*/i)) {
-+              var join_text = s.auto_join_text_url;
-+            } else if (item.text.match(/^((\w+ed)|just) .*/im)) {
-+              var join_text = s.auto_join_text_ed;
-+            } else if (item.text.match(/^(\w*ing) .*/i)) {
-+              var join_text = s.auto_join_text_ing;
-+            } else {
-+              var join_text = s.auto_join_text_default;
-+            }
-+          } else {
-+            var join_text = s.join_text;
-+          };
-+
-+          var from_user = item.from_user || item.user.screen_name;
-+          var profile_image_url = item.profile_image_url || item.user.profile_image_url;
-+          var join_template = '<span class="tweet_join"> '+join_text+' </span>';
-+          var join = ((s.join_text) ? join_template : ' ');
-+          var avatar_template = '<a class="tweet_avatar" href="http://twitter.com/'+from_user+'"><img src="'+profile_image_url+'" height="'+s.avatar_size+'" width="'+s.avatar_size+'" alt="'+from_user+'\'s avatar" title="'+from_user+'\'s avatar" border="0"/></a>';
-+          var avatar = (s.avatar_size ? avatar_template : '');
-+          var date = '<a href="http://twitter.com/'+from_user+'/statuses/'+item.id+'" title="view tweet on twitter">'+relative_time(item.created_at)+'</a>';
-+          var text = '<span class="tweet_text">' +$([item.text]).linkUrl().linkUser().linkHash().makeHeart().capAwesome().capEpic()[0]+ '</span>';
-+
-+          // until we create a template option, arrange the items below to alter a tweet's display.
-+          list.append('<li>' + avatar + date + join + text + '</li>');
-+
-+          list.children('li:first').addClass('tweet_first');
-+          list.children('li:odd').addClass('tweet_even');
-+          list.children('li:even').addClass('tweet_odd');
-+        });
-+        if (s.outro_text) list.after(outro);
-+      });
-+
-+    });
-+  };
-+})(jQuery);
-\ No newline at end of file
-diff --git a/doc/source/_static/nature.css b/doc/source/_static/nature.css
-new file mode 100644
-index 0000000..a98bd42
---- /dev/null
-+++ b/doc/source/_static/nature.css
-@@ -0,0 +1,245 @@
-+/*
-+ * nature.css_t
-+ * ~~~~~~~~~~~~
-+ *
-+ * Sphinx stylesheet -- nature theme.
-+ *
-+ * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
-+ * :license: BSD, see LICENSE for details.
-+ *
-+ */
-+ 
-+@import url("basic.css");
-+ 
-+/* -- page layout ----------------------------------------------------------- */
-+ 
-+body {
-+    font-family: Arial, sans-serif;
-+    font-size: 100%;
-+    background-color: #111;
-+    color: #555;
-+    margin: 0;
-+    padding: 0;
-+}
-+
-+div.documentwrapper {
-+    float: left;
-+    width: 100%;
-+}
-+
-+div.bodywrapper {
-+    margin: 0 0 0 {{ theme_sidebarwidth|toint }}px;
-+}
-+
-+hr {
-+    border: 1px solid #B1B4B6;
-+}
-+ 
-+div.document {
-+    background-color: #eee;
-+}
-+ 
-+div.body {
-+    background-color: #ffffff;
-+    color: #3E4349;
-+    padding: 0 30px 30px 30px;
-+    font-size: 0.9em;
-+}
-+ 
-+div.footer {
-+    color: #555;
-+    width: 100%;
-+    padding: 13px 0;
-+    text-align: center;
-+    font-size: 75%;
-+}
-+ 
-+div.footer a {
-+    color: #444;
-+    text-decoration: underline;
-+}
-+ 
-+div.related {
-+    background-color: #6BA81E;
-+    line-height: 32px;
-+    color: #fff;
-+    text-shadow: 0px 1px 0 #444;
-+    font-size: 0.9em;
-+}
-+ 
-+div.related a {
-+    color: #E2F3CC;
-+}
-+ 
-+div.sphinxsidebar {
-+    font-size: 0.75em;
-+    line-height: 1.5em;
-+}
-+
-+div.sphinxsidebarwrapper{
-+    padding: 20px 0;
-+}
-+ 
-+div.sphinxsidebar h3,
-+div.sphinxsidebar h4 {
-+    font-family: Arial, sans-serif;
-+    color: #222;
-+    font-size: 1.2em;
-+    font-weight: normal;
-+    margin: 0;
-+    padding: 5px 10px;
-+    background-color: #ddd;
-+    text-shadow: 1px 1px 0 white
-+}
-+
-+div.sphinxsidebar h4{
-+    font-size: 1.1em;
-+}
-+ 
-+div.sphinxsidebar h3 a {
-+    color: #444;
-+}
-+ 
-+ 
-+div.sphinxsidebar p {
-+    color: #888;
-+    padding: 5px 20px;
-+}
-+ 
-+div.sphinxsidebar p.topless {
-+}
-+ 
-+div.sphinxsidebar ul {
-+    margin: 10px 20px;
-+    padding: 0;
-+    color: #000;
-+}
-+ 
-+div.sphinxsidebar a {
-+    color: #444;
-+}
-+ 
-+div.sphinxsidebar input {
-+    border: 1px solid #ccc;
-+    font-family: sans-serif;
-+    font-size: 1em;
-+}
-+
-+div.sphinxsidebar input[type=text]{
-+    margin-left: 20px;
-+}
-+ 
-+/* -- body styles ----------------------------------------------------------- */
-+ 
-+a {
-+    color: #005B81;
-+    text-decoration: none;
-+}
-+ 
-+a:hover {
-+    color: #E32E00;
-+    text-decoration: underline;
-+}
-+ 
-+div.body h1,
-+div.body h2,
-+div.body h3,
-+div.body h4,
-+div.body h5,
-+div.body h6 {
-+    font-family: Arial, sans-serif;
-+    background-color: #BED4EB;
-+    font-weight: normal;
-+    color: #212224;
-+    margin: 30px 0px 10px 0px;
-+    padding: 5px 0 5px 10px;
-+    text-shadow: 0px 1px 0 white
-+}
-+ 
-+div.body h1 { border-top: 20px solid white; margin-top: 0; font-size: 200%; }
-+div.body h2 { font-size: 150%; background-color: #C8D5E3; }
-+div.body h3 { font-size: 120%; background-color: #D8DEE3; }
-+div.body h4 { font-size: 110%; background-color: #D8DEE3; }
-+div.body h5 { font-size: 100%; background-color: #D8DEE3; }
-+div.body h6 { font-size: 100%; background-color: #D8DEE3; }
-+ 
-+a.headerlink {
-+    color: #c60f0f;
-+    font-size: 0.8em;
-+    padding: 0 4px 0 4px;
-+    text-decoration: none;
-+}
-+ 
-+a.headerlink:hover {
-+    background-color: #c60f0f;
-+    color: white;
-+}
-+ 
-+div.body p, div.body dd, div.body li {
-+    line-height: 1.5em;
-+}
-+ 
-+div.admonition p.admonition-title + p {
-+    display: inline;
-+}
-+
-+div.highlight{
-+    background-color: white;
-+}
-+
-+div.note {
-+    background-color: #eee;
-+    border: 1px solid #ccc;
-+}
-+ 
-+div.seealso {
-+    background-color: #ffc;
-+    border: 1px solid #ff6;
-+}
-+ 
-+div.topic {
-+    background-color: #eee;
-+}
-+ 
-+div.warning {
-+    background-color: #ffe4e4;
-+    border: 1px solid #f66;
-+}
-+ 
-+p.admonition-title {
-+    display: inline;
-+}
-+ 
-+p.admonition-title:after {
-+    content: ":";
-+}
-+ 
-+pre {
-+    padding: 10px;
-+    background-color: White;
-+    color: #222;
-+    line-height: 1.2em;
-+    border: 1px solid #C6C9CB;
-+    font-size: 1.1em;
-+    margin: 1.5em 0 1.5em 0;
-+    -webkit-box-shadow: 1px 1px 1px #d8d8d8;
-+    -moz-box-shadow: 1px 1px 1px #d8d8d8;
-+}
-+ 
-+tt {
-+    background-color: #ecf0f3;
-+    color: #222;
-+    /* padding: 1px 2px; */
-+    font-size: 1.1em;
-+    font-family: monospace;
-+}
-+
-+.viewcode-back {
-+    font-family: Arial, sans-serif;
-+}
-+
-+div.viewcode-block:target {
-+    background-color: #f4debf;
-+    border-top: 1px solid #ac9;
-+    border-bottom: 1px solid #ac9;
-+}
-diff --git a/doc/source/_static/tweaks.css b/doc/source/_static/tweaks.css
-new file mode 100644
-index 0000000..9977c65
---- /dev/null
-+++ b/doc/source/_static/tweaks.css
-@@ -0,0 +1,95 @@
-+body {
-+  background: #fff url(../_static/header_bg.jpg) top left no-repeat;
-+}
-+
-+#header {
-+  width: 950px;
-+  margin: 0 auto;
-+  height: 102px;
-+}
-+
-+#header h1#logo {
-+  background: url(../_static/openstack_logo.png) top left no-repeat;
-+  display: block;
-+  float: left;
-+  text-indent: -9999px;
-+  width: 175px;
-+  height: 55px;
-+}
-+
-+#navigation {
-+  background: url(../_static/header-line.gif) repeat-x 0 bottom;
-+  display: block;
-+  float: left;
-+  margin: 27px 0 0 25px;
-+  padding: 0;
-+}
-+
-+#navigation li{
-+  float: left;
-+  display: block;
-+  margin-right: 25px;
-+}
-+
-+#navigation li a {
-+  display: block;
-+  font-weight: normal;
-+  text-decoration: none;
-+  background-position: 50% 0;
-+  padding: 20px 0 5px;
-+  color: #353535;
-+  font-size: 14px;
-+}
-+
-+#navigation li a.current, #navigation li a.section {
-+  border-bottom: 3px solid #cf2f19;
-+  color: #cf2f19;
-+}
-+
-+div.related {
-+  background-color: #cde2f8;
-+  border: 1px solid #b0d3f8;
-+}
-+
-+div.related a {
-+  color: #4078ba;
-+  text-shadow: none;
-+}
-+
-+div.sphinxsidebarwrapper {
-+  padding-top: 0;
-+  overflow: hidden;
-+}
-+
-+pre {
-+  color: #555;
-+}
-+
-+div.documentwrapper h1, div.documentwrapper h2, div.documentwrapper h3, div.documentwrapper h4, div.documentwrapper h5, div.documentwrapper h6 {
-+  font-family: 'PT Sans', sans-serif !important;
-+  color: #264D69;
-+  border-bottom: 1px dotted #C5E2EA;
-+  padding: 0;
-+  background: none;
-+  padding-bottom: 5px;
-+}
-+
-+div.documentwrapper h3 {
-+  color: #CF2F19;
-+}
-+
-+a.headerlink {
-+  color: #fff !important;
-+  margin-left: 5px;
-+  background: #CF2F19 !important;
-+}
-+
-+div.body {
-+  margin-top: -25px;
-+  margin-left: 230px;
-+}
-+
-+div.document {
-+  width: 960px;
-+  margin: 0 auto;
-+}
-diff --git a/doc/source/_templates/.placeholder b/doc/source/_templates/.placeholder
-new file mode 100644
-index 0000000..e69de29
-diff --git a/doc/source/_theme/layout.html b/doc/source/_theme/layout.html
-new file mode 100644
-index 0000000..750b782
---- /dev/null
-+++ b/doc/source/_theme/layout.html
-@@ -0,0 +1,83 @@
-+{% extends "basic/layout.html" %}
-+{% set css_files = css_files + ['_static/tweaks.css'] %}
-+{% set script_files = script_files + ['_static/jquery.tweet.js'] %}
-+
-+{%- macro sidebar() %}
-+      {%- if not embedded %}{% if not theme_nosidebar|tobool %}
-+      <div class="sphinxsidebar">
-+        <div class="sphinxsidebarwrapper">
-+          {%- block sidebarlogo %}
-+          {%- if logo %}
-+            <p class="logo"><a href="{{ pathto(master_doc) }}">
-+              <img class="logo" src="{{ pathto('_static/' + logo, 1) }}" alt="Logo"/>
-+            </a></p>
-+          {%- endif %}
-+          {%- endblock %}
-+          {%- block sidebartoc %}
-+          {%- if display_toc %}
-+            <h3><a href="{{ pathto(master_doc) }}">{{ _('Table Of Contents') }}</a></h3>
-+            {{ toc }}
-+          {%- endif %}
-+          {%- endblock %}
-+          {%- block sidebarrel %}
-+          {%- if prev %}
-+            <h4>{{ _('Previous topic') }}</h4>
-+            <p class="topless"><a href="{{ prev.link|e }}"
-+                                  title="{{ _('previous chapter') }}">{{ prev.title }}</a></p>
-+          {%- endif %}
-+          {%- if next %}
-+            <h4>{{ _('Next topic') }}</h4>
-+            <p class="topless"><a href="{{ next.link|e }}"
-+                                  title="{{ _('next chapter') }}">{{ next.title }}</a></p>
-+          {%- endif %}
-+          {%- endblock %}
-+          {%- block sidebarsourcelink %}
-+          {%- if show_source and has_source and sourcename %}
-+            <h3>{{ _('This Page') }}</h3>
-+            <ul class="this-page-menu">
-+              <li><a href="{{ pathto('_sources/' + sourcename, true)|e }}"
-+                     rel="nofollow">{{ _('Show Source') }}</a></li>
-+            </ul>
-+          {%- endif %}
-+          {%- endblock %}
-+          {%- if customsidebar %}
-+          {% include customsidebar %}
-+          {%- endif %}
-+          {%- block sidebarsearch %}
-+          {%- if pagename != "search" %}
-+          <div id="searchbox" style="display: none">
-+            <h3>{{ _('Quick search') }}</h3>
-+              <form class="search" action="{{ pathto('search') }}" method="get">
-+                <input type="text" name="q" size="18" />
-+                <input type="submit" value="{{ _('Go') }}" />
-+                <input type="hidden" name="check_keywords" value="yes" />
-+                <input type="hidden" name="area" value="default" />
-+              </form>
-+              <p class="searchtip" style="font-size: 90%">
-+              {{ _('Enter search terms or a module, class or function name.') }}
-+              </p>
-+          </div>
-+          <script type="text/javascript">$('#searchbox').show(0);</script>
-+          {%- endif %}
-+          {%- endblock %}
-+        </div>
-+      </div>
-+      {%- endif %}{% endif %}
-+{%- endmacro %}
-+
-+{% block relbar1 %}{% endblock relbar1 %}
-+
-+{% block header %}
-+  <div id="header">
-+    <h1 id="logo"><a href="http://www.openstack.org/">OpenStack</a></h1>
-+    <ul id="navigation">
-+      <li><a href="http://www.openstack.org/" title="Go to the Home page" class="link">Home</a></li>
-+      <li><a href="http://www.openstack.org/projects/" title="Go to the OpenStack Projects page">Projects</a></li>
-+      <li><a href="http://www.openstack.org/user-stories/" title="Go to the User Stories page" class="link">User Stories</a></li>
-+      <li><a href="http://www.openstack.org/community/" title="Go to the Community page" class="link">Community</a></li>
-+      <li><a href="http://www.openstack.org/blog/" title="Go to the OpenStack Blog">Blog</a></li>
-+      <li><a href="http://wiki.openstack.org/" title="Go to the OpenStack Wiki">Wiki</a></li>
-+      <li><a href="http://docs.openstack.org/" title="Go to OpenStack Documentation" class="current">Documentation</a></li>
-+    </ul>
-+  </div>
-+{% endblock %}
-\ No newline at end of file
-diff --git a/doc/source/_theme/theme.conf b/doc/source/_theme/theme.conf
-new file mode 100644
-index 0000000..1cc4004
---- /dev/null
-+++ b/doc/source/_theme/theme.conf
-@@ -0,0 +1,4 @@
-+[theme]
-+inherit = basic
-+stylesheet = nature.css
-+pygments_style = tango
-diff --git a/doc/source/conf.py b/doc/source/conf.py
-index 30e4b6d..ec9e63f 100644
---- a/doc/source/conf.py
-+++ b/doc/source/conf.py
-@@ -144,12 +144,13 @@ extensions = ['sphinx.ext.autodoc',
-               'sphinx.ext.todo',
-               'sphinx.ext.coverage',
-               'sphinx.ext.pngmath',
--              'sphinx.ext.viewcode',
--              'oslo.sphinx',
--              ]
-+              'sphinx.ext.viewcode']
- # Add any paths that contain templates here, relative to this directory.
--templates_path = ['_templates']
-+if os.getenv('HUDSON_PUBLISH_DOCS'):
-+    templates_path = ['_ga', '_templates']
-+else:
-+    templates_path = ['_templates']
- # The suffix of source filenames.
- source_suffix = '.rst'
-@@ -216,8 +217,8 @@ nitpicky = False
- # The theme to use for HTML and HTML Help pages.  See the documentation for
- # a list of builtin themes.
--# html_theme_path = ['.']
--# html_theme = '_theme'
-+html_theme_path = ['.']
-+html_theme = '_theme'
- # Theme options are theme-specific and customize the look and feel of a theme
- # further.  For a list of options available for each theme, see the
-diff --git a/test-requirements.txt b/test-requirements.txt
-index 6f771b2..3ddb8a0 100644
---- a/test-requirements.txt
-+++ b/test-requirements.txt
-@@ -14,4 +14,3 @@ selenium
- sphinx>=1.1.2,<1.2
- # for bug 1091333, remove after sphinx >1.1.3 is released.
- docutils==0.9.1
--oslo.sphinx
similarity index 92%
rename from rpm/SOURCES/0006-move-RBAC-policy-files-and-checks-to-etc-openstack-d.patch
rename to rpm/SOURCES/0005-move-RBAC-policy-files-and-checks-to-etc-openstack-d.patch
index 1dbf37bae23dea07a26502e3672cd8857c14ab25..8876377047aca1671acb5ac2532684ab3de055cd 100644 (file)
@@ -1,4 +1,4 @@
-From 78e5ed6e2be464922850f68ec4c371428c9c56d7 Mon Sep 17 00:00:00 2001
+From 499eaf237a6fb1b8e0233f59793d54827bfbf2e7 Mon Sep 17 00:00:00 2001
 From: Matthias Runge <mrunge@redhat.com>
 Date: Mon, 9 Sep 2013 14:13:07 +0200
 Subject: [PATCH] move RBAC policy files and checks to /etc/openstack-dashboard
@@ -8,7 +8,7 @@ Subject: [PATCH] move RBAC policy files and checks to /etc/openstack-dashboard
  1 file changed, 6 insertions(+), 5 deletions(-)
 
 diff --git a/openstack_dashboard/local/local_settings.py.example b/openstack_dashboard/local/local_settings.py.example
-index d386d46..afa95f1 100644
+index 832358e..6838944 100644
 --- a/openstack_dashboard/local/local_settings.py.example
 +++ b/openstack_dashboard/local/local_settings.py.example
 @@ -228,12 +228,13 @@ TIME_ZONE = "UTC"
similarity index 83%
rename from rpm/SOURCES/0007-move-SECRET_KEY-secret_key_store-to-tmp.patch
rename to rpm/SOURCES/0006-move-SECRET_KEYSTORE-to-var-lib-openstack-dashboard.patch
index 241938691ea8e21ea2d0678c9fe5326676ad89f9..8342e29ede784c539e8b3d8768ba98e43707e147 100644 (file)
@@ -1,14 +1,14 @@
-From 09539805488bcb346dbd43770f4d0d9edf39c800 Mon Sep 17 00:00:00 2001
+From 7f7882eb403c493cb857c0c7523e964ffd165c19 Mon Sep 17 00:00:00 2001
 From: Matthias Runge <mrunge@redhat.com>
 Date: Mon, 9 Sep 2013 20:52:51 +0200
-Subject: [PATCH] move SECRET_KEY secret_key_store to /tmp
+Subject: [PATCH] move SECRET_KEYSTORE to '/var/lib/openstack-dashboard'
 
 ---
  openstack_dashboard/local/local_settings.py.example | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 diff --git a/openstack_dashboard/local/local_settings.py.example b/openstack_dashboard/local/local_settings.py.example
-index afa95f1..d120dfc 100644
+index 6838944..cd31406 100644
 --- a/openstack_dashboard/local/local_settings.py.example
 +++ b/openstack_dashboard/local/local_settings.py.example
 @@ -77,7 +77,6 @@ HORIZON_CONFIG = {
@@ -23,7 +23,7 @@ index afa95f1..d120dfc 100644
  # requests routed to the same dashboard instance or you set the same SECRET_KEY
  # for all of them.
  from horizon.utils import secret_key
-+LOCAL_PATH = '/tmp'
++LOCAL_PATH = '/var/lib/openstack-dashboard'
  SECRET_KEY = secret_key.generate_or_read_from_file(os.path.join(LOCAL_PATH, '.secret_key_store'))
  
  # We recommend you use memcached for development; otherwise after every reload
diff --git a/rpm/SOURCES/0008-fix-up-issues-with-customization.patch b/rpm/SOURCES/0008-fix-up-issues-with-customization.patch
deleted file mode 100644 (file)
index 6bcd77b..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-From 9bf1112382a3ce8ea197f207c417c7351dc05c8f Mon Sep 17 00:00:00 2001
-From: Matthias Runge <mrunge@redhat.com>
-Date: Thu, 19 Sep 2013 12:58:00 +0200
-Subject: [PATCH] fix up issues with customization
-
----
- openstack_dashboard_theme/__init__.py              |  1 +
- openstack_dashboard_theme/models.py                |  1 +
- .../static/dashboard/less/rhtheme.less             |  2 +-
- .../templates/horizon/common/_sidebar.html         | 23 ++++++++++++++++++++--
- 4 files changed, 24 insertions(+), 3 deletions(-)
-
-diff --git a/openstack_dashboard_theme/__init__.py b/openstack_dashboard_theme/__init__.py
-index e69de29..94456ab 100644
---- a/openstack_dashboard_theme/__init__.py
-+++ b/openstack_dashboard_theme/__init__.py
-@@ -0,0 +1 @@
-+# intentionally left blank
-diff --git a/openstack_dashboard_theme/models.py b/openstack_dashboard_theme/models.py
-index e69de29..94456ab 100644
---- a/openstack_dashboard_theme/models.py
-+++ b/openstack_dashboard_theme/models.py
-@@ -0,0 +1 @@
-+# intentionally left blank
-diff --git a/openstack_dashboard_theme/static/dashboard/less/rhtheme.less b/openstack_dashboard_theme/static/dashboard/less/rhtheme.less
-index 5350db3..2d8b2d0 100644
---- a/openstack_dashboard_theme/static/dashboard/less/rhtheme.less
-+++ b/openstack_dashboard_theme/static/dashboard/less/rhtheme.less
-@@ -1,4 +1,4 @@
--@import "/static/dashboard/less/horizon.less";
-+@import "horizon.less";
- /* Login Splash Page */
-diff --git a/openstack_dashboard_theme/templates/horizon/common/_sidebar.html b/openstack_dashboard_theme/templates/horizon/common/_sidebar.html
-index 5672846..df66c62 100644
---- a/openstack_dashboard_theme/templates/horizon/common/_sidebar.html
-+++ b/openstack_dashboard_theme/templates/horizon/common/_sidebar.html
-@@ -1,7 +1,8 @@
- {% load branding horizon i18n %}
-+{% load url from future %}
- <div class='sidebar'>
--  <h1 class="rhos clearfix"><a href="{% url horizon:user_home %}">{% site_branding %}</a></h1>
-+  <h1 class="rhos clearfix"><a href="{% url 'horizon:user_home' %}">{% site_branding %}</a></h1>
-   {% horizon_main_nav %}
-@@ -22,7 +23,7 @@
-           <li class='divider'></li>
-           {% for tenant in authorized_tenants %}
-             {% if tenant.enabled and tenant.id != request.user.tenant_id %}
--              <li><a href="{% url switch_tenants tenant.id %}">{{ tenant.name }}</a></li>
-+              <li><a href="{% url 'switch_tenants' tenant.id %}?next={{ request.horizon.dashboard.get_absolute_url }}">{{ tenant.name }}</a></li>
-             {% endif %}
-           {% endfor %}
-         </ul>
-@@ -31,5 +32,23 @@
-   </div>
-   {% endif %}
-+  {% with num_of_regions=request.user.available_services_regions|length %}
-+  {% if num_of_regions > 1 %}
-+  <div id="services_region_switcher" class="dropdown switcher_bar" tabindex="1">
-+    <a class="dropdown-toggle" data-toggle="dropdown" href="#services_region_switcher">
-+        <h4>{% trans "Managing Region" %}</h4>
-+        <h3>{{ request.user.services_region }}</h3>
-+    </a>
-+
-+    <ul id="services_regions_list" class="dropdown-menu">
-+        <li class='divider'></li>
-+        {% for region in request.user.available_services_regions %}
-+        <li><a href="{% url 'switch_services_region' region %}?next={{ request.horizon.panel.get_absolute_url }}">{{ region }}</a></li>
-+        {% endfor %}
-+    </ul>
-+  </div>
-+  {% endif %}
-+  {% endwith %}
-+
-   {% horizon_dashboard_nav %}
- </div>
diff --git a/rpm/SOURCES/0009-do-not-truncate-the-logo-related-rhbz-877138.patch b/rpm/SOURCES/0009-do-not-truncate-the-logo-related-rhbz-877138.patch
deleted file mode 100644 (file)
index bdf61fa..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-From daed1adb7fa46c0398542f88ebf002088daf96b3 Mon Sep 17 00:00:00 2001
-From: Matthias Runge <mrunge@redhat.com>
-Date: Thu, 19 Sep 2013 13:58:16 +0200
-Subject: [PATCH] do not truncate the logo (related rhbz 877138)
-
----
- openstack_dashboard_theme/static/dashboard/less/rhtheme.less | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/openstack_dashboard_theme/static/dashboard/less/rhtheme.less b/openstack_dashboard_theme/static/dashboard/less/rhtheme.less
-index 2d8b2d0..d70852e 100644
---- a/openstack_dashboard_theme/static/dashboard/less/rhtheme.less
-+++ b/openstack_dashboard_theme/static/dashboard/less/rhtheme.less
-@@ -46,10 +46,10 @@ h1.rhos a {
-     background: url(/static/dashboard/img/rh-logo.png) top left no-repeat;
-     display: block;
-     float: left;
--    width: 116px;
-+    width: 123px;
-     height: 123px;
-     text-indent: -9999px;
--    margin-left: 56px;
-+    margin-left: 53px;
-     margin-top: 15px;
-     margin-bottom: 25px;
- }
diff --git a/rpm/SOURCES/0010-move-SECRET_KEYSTORE-to-var-lib-openstack-dashboard.patch b/rpm/SOURCES/0010-move-SECRET_KEYSTORE-to-var-lib-openstack-dashboard.patch
deleted file mode 100644 (file)
index d7076f3..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-From 2c3a2c7c2c7e0d396bc80ebfa9fdc2af773050c1 Mon Sep 17 00:00:00 2001
-From: Matthias Runge <mrunge@redhat.com>
-Date: Fri, 4 Oct 2013 09:46:36 +0200
-Subject: [PATCH] move SECRET_KEYSTORE to '/var/lib/openstack-dashboard'
-
----
- openstack_dashboard/local/local_settings.py.example | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/openstack_dashboard/local/local_settings.py.example b/openstack_dashboard/local/local_settings.py.example
-index d120dfc..a60ad0c 100644
---- a/openstack_dashboard/local/local_settings.py.example
-+++ b/openstack_dashboard/local/local_settings.py.example
-@@ -88,7 +88,7 @@ HORIZON_CONFIG = {
- # requests routed to the same dashboard instance or you set the same SECRET_KEY
- # for all of them.
- from horizon.utils import secret_key
--LOCAL_PATH = '/tmp'
-+LOCAL_PATH = '/var/lib/openstack-dashboard'
- SECRET_KEY = secret_key.generate_or_read_from_file(os.path.join(LOCAL_PATH, '.secret_key_store'))
- # We recommend you use memcached for development; otherwise after every reload
index b06a7e7fa863d23b0f1346b1258d48e7eee60e44..73b2b65e2578a79c464ba8fe877b9d5a23dabaa9 100644 (file)
@@ -1,5 +1,5 @@
 Name:       python-django-horizon
-Version:    2013.2
+Version:    2013.2.3
 Release:    1%{?dist}
 Summary:    Django application for talking to Openstack
 
@@ -7,8 +7,7 @@ Group:      Development/Libraries
 # Code in horizon/horizon/utils taken from django which is BSD
 License:    ASL 2.0 and BSD
 URL:        http://horizon.openstack.org/
-BuildArch:  noarch
-Source0:    horizon-2013.2.2.fuel4.1.tar.gz 
+Source0:    https://launchpad.net/horizon/havana/%{version}/+download/horizon-%{version}.tar.gz
 Source1:    openstack-dashboard.conf
 Source2:    openstack-dashboard-httpd-2.4.conf
 
@@ -20,35 +19,42 @@ Source10:   rhfavicon.ico
 Source11:   rh-logo.png
 
 #
-# patches_base=2013.2
+# patches_base=2013.2.3
 #
 Patch0001: 0001-Don-t-access-the-net-while-building-docs.patch
 Patch0002: 0002-disable-debug-move-web-root.patch
 Patch0003: 0003-change-lockfile-location-to-tmp-and-also-add-localho.patch
 Patch0004: 0004-Add-a-customization-module-based-on-RHOS.patch
-Patch0005: 0005-Revert-Use-oslo.sphinx-and-remove-local-copy-of-doc-.patch
-Patch0006: 0006-move-RBAC-policy-files-and-checks-to-etc-openstack-d.patch
-Patch0007: 0007-move-SECRET_KEY-secret_key_store-to-tmp.patch
-Patch0008: 0008-fix-up-issues-with-customization.patch
-Patch0009: 0009-do-not-truncate-the-logo-related-rhbz-877138.patch
-Patch0010: 0010-move-SECRET_KEYSTORE-to-var-lib-openstack-dashboard.patch
+Patch0005: 0005-move-RBAC-policy-files-and-checks-to-etc-openstack-d.patch
+Patch0006: 0006-move-SECRET_KEYSTORE-to-var-lib-openstack-dashboard.patch
+
 #mirantis OpenStack patch
 Patch0100: mos-disable-metering.patch
 Patch0101: mos-fix-murano-savana-dashboard.patch
 
+BuildArch:  noarch
 
+## epel6 has a separate Django14 package
+#%if 0%{?rhel}==6
+#Requires:   Django14
+#BuildRequires:   Django14
+#%else
+#BuildRequires:   Django
+#Requires:   Django
+#%endif
 
 # Migrate to Django 15 (python-django)
 BuildRequires:  python-django
 Requires:  python-django
 
-
 Requires:   python-dateutil
 Requires:   pytz
 Requires:   python-lockfile
+Requires:   python-pbr
 
 BuildRequires: python2-devel
 BuildRequires: python-setuptools
+BuildRequires: git
 BuildRequires: python-d2to1
 BuildRequires: python-pbr >= 0.5.21
 BuildRequires: python-lockfile
@@ -97,10 +103,10 @@ Requires:   python-cinderclient
 Requires:   python-swiftclient
 Requires:   python-heatclient
 Requires:   python-ceilometerclient >= 1.0.5
-# Requires:  python-troveclient
+Requires:   python-troveclient
 Requires:   python-netaddr
 Requires:   python-oslo-config
-Requires:   python-lesscpy
+Requires:   python-eventlet
 
 BuildRequires: python2-devel
 BuildRequires: python-django-openstack-auth >= 1.0.11
@@ -138,7 +144,8 @@ BuildRequires: python-cinderclient
 BuildRequires: python-swiftclient
 BuildRequires: python-heatclient
 BuildRequires: python-ceilometerclient
-# BuildRequires:  python-troveclient
+BuildRequires: python-troveclient
+BuildRequires: python-oslo-sphinx
 
 %description doc
 Documentation for the Django Horizon application for talking with Openstack
@@ -152,20 +159,24 @@ Customization module for OpenStack Dashboard to provide a branded logo.
 
 %prep
 %setup -q -n horizon-%{version}
-
+## Use git to manage patches.
+## http://rwmj.wordpress.com/2011/08/09/nice-rpm-git-patch-management-trick/
+#git init
+#git config user.email "python-django-horizon-owner@fedoraproject.org"
+#git config user.name "python-django-horizon"
+#git add .
+#git commit -a -q -m "%{version} baseline"
+#git am %{patches}
 %patch0001 -p1
 %patch0002 -p1
 %patch0003 -p1
 %patch0004 -p1
 %patch0005 -p1
 %patch0006 -p1
-%patch0007 -p1
-%patch0008 -p1
-%patch0009 -p1
-%patch0010 -p1
 %patch0100 -p1
 %patch0101 -p1
 
+
 # remove unnecessary .po files
 find . -name "django*.po" -exec rm -f '{}' \;
 
@@ -266,6 +277,10 @@ cp -a static/* %{buildroot}%{_datadir}/openstack-dashboard/static
 
 # create /var/run/openstack-dashboard/ and own it
 mkdir -p %{buildroot}%{_sharedstatedir}/openstack-dashboard
+
+# create /var/log/horizon and own it
+mkdir -p %{buildroot}%{_var}/log/horizon
+
 #%check
 #sed -i 's:^SECRET_KEY =.*:SECRET_KEY = "badcafe":' openstack_dashboard/local/local_settings.py
 #./run_tests.sh -N
@@ -313,6 +328,7 @@ mkdir -p %{buildroot}%{_sharedstatedir}/openstack-dashboard
 
 %dir %attr(0750, root, apache) %{_sysconfdir}/openstack-dashboard
 %dir %attr(0750, apache, apache) %{_sharedstatedir}/openstack-dashboard
+%dir %attr(0750, apache, apache) %{_var}/log/horizon
 %config(noreplace) %{_sysconfdir}/httpd/conf.d/openstack-dashboard.conf
 %config(noreplace) %attr(0640, root, apache) %{_sysconfdir}/openstack-dashboard/local_settings
 %config(noreplace) %attr(0640, root, apache) %{_sysconfdir}/openstack-dashboard/keystone_policy.json
@@ -325,8 +341,26 @@ mkdir -p %{buildroot}%{_sharedstatedir}/openstack-dashboard
 %{_datadir}/openstack-dashboard/openstack_dashboard_theme
 
 %changelog
-* Fri Oct 18 2013 Matthias Runge <mrunge@redhat.com> - 2013.2-1
+* Thu Apr 10 2014 Matthias Runge <mrunge@redhat.com> - 2013.2.3-1
+- rebase to 2013.2.3
+- fix CVE-2014-0157 (rhbz#1085826)
+
+* Fri Feb 14 2014 Matthias Runge <mrunge@redhat.com> - 2013.2.2-1
+- rebase to 2013.2.2
+
+* Wed Dec 18 2013 Matthias Runge <mrunge@redhat.com> - 2013.2.1-1
+- rebase to 2013.2.1
+
+* Tue Dec 03 2013 Matthias Runge <mrunge@redhat.com> - 2013.2-4
+- fix CVE-2013-6406 (RHBZ#1035914)
+
+* Thu Nov 21 2013 Matthias Runge <mrunge@redhat.com> - 2013.2-3
+- add runtime requiremt python-pbr
+
+* Fri Oct 18 2013 Matthias Runge <mrunge@redhat.com> - 2013.2-2
 - Horizon-2013.2 final
+- create /var/log/horizon
+- add requirement to python-eventlet
 
 * Thu Oct 17 2013 Matthias Runge <mrunge@redhat.com> - 2013.2.0.15.rc3
 - rebase to Havana-rc3