Browse Source

Adding Heat Resource Topology to Horizon

Change-Id: Ie9f2040850df3d7f1fcefe68430e9103c972f80f
Implements: blueprint heat-ui-resource-topology
Tim Schnell 5 years ago
parent
commit
8914ed95fc
31 changed files with 1376 additions and 3 deletions
  1. 275
    0
      horizon/static/horizon/js/horizon.heattop.js
  2. 1
    0
      horizon/templates/horizon/_scripts.html
  3. 84
    0
      openstack_dashboard/dashboards/project/stacks/api.py
  4. 62
    0
      openstack_dashboard/dashboards/project/stacks/mappings.py
  5. 31
    0
      openstack_dashboard/dashboards/project/stacks/sro.py
  6. 17
    1
      openstack_dashboard/dashboards/project/stacks/tabs.py
  7. 9
    0
      openstack_dashboard/dashboards/project/stacks/templates/stacks/_detail_topology.html
  8. 10
    0
      openstack_dashboard/dashboards/project/stacks/templates/stacks/_resource_info.html
  9. 16
    0
      openstack_dashboard/dashboards/project/stacks/templates/stacks/_stack_info.html
  10. 4
    0
      openstack_dashboard/dashboards/project/stacks/urls.py
  11. 2
    0
      openstack_dashboard/dashboards/project/stacks/views.py
  12. BIN
      openstack_dashboard/static/dashboard/img/db-gray.gif
  13. 85
    0
      openstack_dashboard/static/dashboard/img/db-gray.svg
  14. 85
    0
      openstack_dashboard/static/dashboard/img/db-green.svg
  15. 85
    0
      openstack_dashboard/static/dashboard/img/db-red.svg
  16. BIN
      openstack_dashboard/static/dashboard/img/lb-gray.gif
  17. 43
    0
      openstack_dashboard/static/dashboard/img/lb-gray.svg
  18. 43
    0
      openstack_dashboard/static/dashboard/img/lb-green.svg
  19. 43
    0
      openstack_dashboard/static/dashboard/img/lb-red.svg
  20. BIN
      openstack_dashboard/static/dashboard/img/server-gray.gif
  21. 50
    0
      openstack_dashboard/static/dashboard/img/server-gray.svg
  22. 50
    0
      openstack_dashboard/static/dashboard/img/server-green.svg
  23. 50
    0
      openstack_dashboard/static/dashboard/img/server-red.svg
  24. BIN
      openstack_dashboard/static/dashboard/img/stack-gray.gif
  25. 73
    0
      openstack_dashboard/static/dashboard/img/stack-gray.svg
  26. 82
    0
      openstack_dashboard/static/dashboard/img/stack-green.svg
  27. 92
    0
      openstack_dashboard/static/dashboard/img/stack-red.svg
  28. BIN
      openstack_dashboard/static/dashboard/img/unknown-gray.gif
  29. 33
    0
      openstack_dashboard/static/dashboard/img/unknown-green.svg
  30. 33
    0
      openstack_dashboard/static/dashboard/img/unknown-red.svg
  31. 18
    2
      openstack_dashboard/static/dashboard/less/horizon.less

+ 275
- 0
horizon/static/horizon/js/horizon.heattop.js View File

@@ -0,0 +1,275 @@
1
+/**
2
+ *
3
+ * HeatTop JS Framework
4
+ * Dependencies: jQuery 1.7.1 or later, d3 v3 or later
5
+ * Date: June 2013
6
+ * Description: JS Framework that subclasses the D3 Force Directed Graph library to create
7
+ * Heat-specific objects and relationships with the purpose of displaying
8
+ * Stacks, Resources, and related Properties in a Resource Topology Graph.
9
+ *
10
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may
11
+   not use this file except in compliance with the License. You may obtain
12
+   a copy of the License at
13
+
14
+        http://www.apache.org/licenses/LICENSE-2.0
15
+
16
+   Unless required by applicable law or agreed to in writing, software
17
+   distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
18
+   WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
19
+   License for the specific language governing permissions and limitations
20
+   under the License.
21
+*/
22
+
23
+var container = "#heat_resource_topology";
24
+
25
+if ($(container).length){
26
+    var width = $(container).width(),
27
+    height = 500,
28
+    stack_id = $("#stack_id").data("stack_id"),
29
+    ajax_url = '/project/stacks/get_d3_data/'+stack_id+'/',
30
+    graph = $("#d3_data").data("d3_data"),
31
+    force = d3.layout.force()
32
+        .nodes(graph.nodes)
33
+        .links([])
34
+        .gravity(0.1)
35
+        .charge(-2000)
36
+        .linkDistance(100)
37
+        .size([width, height])
38
+        .on("tick",tick),
39
+    svg = d3.select(container).append("svg")
40
+        .attr("width", width)
41
+        .attr("height", height),
42
+    node = svg.selectAll(".node"),
43
+    link = svg.selectAll(".link"),
44
+    needs_update = false,
45
+    nodes = force.nodes(),
46
+    links = force.links();
47
+
48
+    build_links();
49
+    update();
50
+
51
+
52
+    function update(){
53
+        node = node.data(nodes, function(d){return d.name});
54
+        link = link.data(links);
55
+
56
+        var nodeEnter = node.enter().append("g")
57
+            .attr("class", "node")
58
+            .attr("node_name", function(d){ return d.name })
59
+            .attr("node_id", function(d){ return d.instance })
60
+            .call(force.drag);
61
+
62
+        nodeEnter.append("image")
63
+            .attr("xlink:href", function(d) { return d.image; })
64
+            .attr("id", function(d){return "image_"+ d.name})
65
+            .attr("x", function(d) { return d.image_x; })
66
+            .attr("y", function(d) { return d.image_y; })
67
+            .attr("width", function(d) { return d.image_size; })
68
+            .attr("height", function(d) { return d.image_size; });
69
+        node.exit().remove();
70
+
71
+        link.enter().insert("svg:line", "g.node")
72
+            .attr("class", "link")
73
+            .style("stroke-width", function(d) { return Math.sqrt(d.value); });
74
+        link.exit().remove();
75
+        //Setup click action for all nodes
76
+        node.on("mouseover", function(d) {
77
+           $("#info_box").html(d.info_box);
78
+            current_info = d.name;
79
+        });
80
+        node.on("mouseout", function(d) {
81
+            $("#info_box").html('');
82
+        });
83
+
84
+        force.start();
85
+    }
86
+    function tick() {
87
+        link.attr("x1", function(d) { return d.source.x; })
88
+            .attr("y1", function(d) { return d.source.y; })
89
+            .attr("x2", function(d) { return d.target.x; })
90
+            .attr("y2", function(d) { return d.target.y; });
91
+
92
+        node.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; });
93
+    }
94
+
95
+    //Load initial Stack box
96
+    $("#stack_box").html(graph.stack.info_box);
97
+    //On Page load, set Action In Progress
98
+    var in_progress = false;
99
+    set_in_progress(graph.stack, node);
100
+
101
+    //If status is In Progress, start AJAX polling
102
+    var poll_time = 0;
103
+    if (in_progress == true){poll_time = 3000;}
104
+    else {poll_time = 30000;}
105
+    ajax_poll(poll_time);
106
+
107
+    function set_in_progress(stack, nodes) {
108
+        if (stack.in_progress == true){in_progress = true;}
109
+        for (var i=0;i<nodes.length;i++) {
110
+            var d = nodes[i];
111
+            if (d.in_progress == true){in_progress = true;return false;}
112
+        }
113
+    }
114
+    function findNode(name) {
115
+        for (var i=0;i<nodes.length;i++) {if (nodes[i].name === name){return nodes[i];}};
116
+    };
117
+
118
+    function findNodeIndex(name) {
119
+        for (var i=0;i<nodes.length;i++) {if (nodes[i].name==name){return i;}};
120
+    };
121
+    function addNode (node) {
122
+        nodes.push(node);
123
+        needs_update = true;
124
+    };
125
+    function removeNode (name) {
126
+        var i = 0;
127
+        var n = findNode(name);
128
+        while (i < links.length) {
129
+            if ((links[i]['source'] == n)||(links[i]['target'] == n))
130
+            {
131
+                links.splice(i,1);
132
+            }
133
+            else i++;
134
+        }
135
+        nodes.splice(findNodeIndex(name),1);
136
+        needs_update = true;
137
+    };
138
+    function remove_nodes(old_nodes, new_nodes){
139
+        //Check for removed nodes
140
+        for (var i=0;i<old_nodes.length;i++) {
141
+            var remove_node = true;
142
+            for (var j=0;j<new_nodes.length;j++) {
143
+                if (old_nodes[i].name==new_nodes[j].name){
144
+                    remove_node = false;
145
+                    break;
146
+                }
147
+            }
148
+            if (remove_node==true){
149
+                removeNode(old_nodes[i].name);
150
+            }
151
+        }
152
+    }
153
+    function build_links(){
154
+        for (var i=0;i<nodes.length;i++){
155
+            build_node_links(nodes[i]);
156
+            build_reverse_links(nodes[i]);
157
+        }
158
+    }
159
+    function build_node_links(node){
160
+        for (var j=0;j<node.required_by.length;j++){
161
+            var push_link = true;
162
+            var target_idx = '';
163
+            var source_idx = findNodeIndex(node.name);
164
+            //make sure target node exists
165
+            try {
166
+                target_idx = findNodeIndex(node.required_by[j]);
167
+            } catch(err) {
168
+                console.log(err);
169
+                push_link =false;
170
+            }
171
+            //check for duplicates
172
+            for (var lidx=0;lidx<links.length;lidx++) {
173
+                if ((links[lidx]['source'] == source_idx)&&(links[lidx]['target'] == target_idx))
174
+                {
175
+                    push_link=false;
176
+                    break;
177
+                }
178
+            }
179
+
180
+            if (push_link==true && (source_idx && target_idx)){
181
+                links.push({
182
+                   'source':source_idx,
183
+                   'target':target_idx,
184
+                   'value':1
185
+                });
186
+            }
187
+        }
188
+    }
189
+
190
+    function build_reverse_links(node){
191
+        for (var i=0;i<nodes.length;i++){
192
+            if(nodes[i].required_by){
193
+                for (var j=0;j<nodes[i].required_by.length;j++){
194
+                    var dependency = nodes[i].required_by[j];
195
+                    //if new node is required by existing node, push new link
196
+                    if(node.name==dependency){
197
+                        links.push({
198
+                            'source':findNodeIndex(nodes[i].name),
199
+                            'target':findNodeIndex(node.name),
200
+                            'value':1
201
+                        })
202
+                    }
203
+                }
204
+            }
205
+        }
206
+    }
207
+
208
+    function ajax_poll(poll_time){
209
+        setTimeout(function() {
210
+            $.getJSON(ajax_url, function(json) {
211
+                //update d3 data element
212
+                $("#d3_data").attr("data-d3_data", JSON.stringify(json));
213
+
214
+                //update stack
215
+                $("#stack_box").html(json.stack.info_box);
216
+                set_in_progress(json.stack, json.nodes);
217
+                needs_update = false;
218
+
219
+                //Check Remove nodes
220
+                remove_nodes(nodes, json.nodes);
221
+
222
+                //Check for updates and new nodes
223
+                json.nodes.forEach(function(d){
224
+                    current_node = findNode(d.name);
225
+                    //Check if node already exists
226
+                    if (current_node) {
227
+                        //Node already exists, just update it
228
+                        current_node.status = d.status;
229
+
230
+                        //Status has changed, image should be updated
231
+                        if (current_node.image != d.image){
232
+                            current_node.image = d.image;
233
+                            var this_image = d3.select("#image_"+current_node.name);
234
+                            this_image
235
+                                    .transition()
236
+                                    .attr("x", function(d) { return d.image_x + 5; })
237
+                                    .duration(100)
238
+                                    .transition()
239
+                                    .attr("x", function(d) { return d.image_x - 5; })
240
+                                    .duration(100)
241
+                                    .transition()
242
+                                    .attr("x", function(d) { return d.image_x + 5; })
243
+                                    .duration(100)
244
+                                    .transition()
245
+                                    .attr("x", function(d) { return d.image_x - 5; })
246
+                                    .duration(100)
247
+                                    .transition()
248
+                                    .attr("xlink:href", d.image)
249
+                                    .transition()
250
+                                    .attr("x", function(d) { return d.image_x; })
251
+                                    .duration(100)
252
+                                    .ease("bounce")
253
+                        }
254
+
255
+                        //Status has changed, update info_box
256
+                        current_node.info_box = d.info_box;
257
+
258
+                    } else {
259
+                        addNode(d);
260
+                        build_links();
261
+                    }
262
+                });
263
+
264
+                //if any updates needed, do update now
265
+                if (needs_update==true){
266
+                    update();
267
+                }
268
+            });
269
+        //if no nodes still in progress, slow AJAX polling
270
+        if (in_progress==false){poll_time = 30000;}
271
+        else {poll_time = 3000;}
272
+        ajax_poll(poll_time);
273
+        }, poll_time);
274
+    }
275
+}

+ 1
- 0
horizon/templates/horizon/_scripts.html View File

@@ -38,6 +38,7 @@
38 38
 <script src='{{ STATIC_URL }}horizon/js/horizon.projects.js' type='text/javascript' charset='utf-8'></script>
39 39
 <script src='{{ STATIC_URL }}horizon/js/horizon.networktopology.js' type='text/javascript' charset='utf-8'></script>
40 40
 <script src='{{ STATIC_URL }}horizon/js/horizon.d3piechart.js' type='text/javascript' charset='utf-8'></script>
41
+<script src='{{ STATIC_URL }}horizon/js/horizon.heattop.js' type='text/javascript' charset='utf-8'></script>
41 42
 {% block custom_js_files %}{% endblock %}
42 43
 {% endcompress %}
43 44
 

+ 84
- 0
openstack_dashboard/dashboards/project/stacks/api.py View File

@@ -0,0 +1,84 @@
1
+import json
2
+import logging
3
+
4
+from django.http import HttpResponse
5
+
6
+from openstack_dashboard.api.heat import resources_list
7
+from openstack_dashboard.api.heat import stack_get
8
+
9
+from openstack_dashboard.dashboards.project.stacks.mappings \
10
+    import get_resource_image
11
+from openstack_dashboard.dashboards.project.stacks.mappings \
12
+    import get_resource_status
13
+from openstack_dashboard.dashboards.project.stacks.sro import resource_info
14
+from openstack_dashboard.dashboards.project.stacks.sro import stack_info
15
+
16
+
17
+LOG = logging.getLogger(__name__)
18
+
19
+
20
+class Stack(object):
21
+    pass
22
+
23
+
24
+def d3_data(request, stack_id=''):
25
+    try:
26
+        stack = stack_get(request, stack_id)
27
+    except:
28
+        stack = Stack()
29
+        stack.id = stack_id
30
+        stack.stack_name = request.session.get('stack_name', '')
31
+        stack.stack_status = 'DELETE_COMPLETE'
32
+        stack.stack_status_reason = 'DELETE_COMPLETE'
33
+
34
+    try:
35
+        resources = resources_list(request, stack.stack_name)
36
+    except:
37
+        resources = []
38
+
39
+    d3_data = {"nodes": [], "stack": {}}
40
+    if stack:
41
+        stack_image = get_resource_image(stack.stack_status, 'stack')
42
+        stack_node = {
43
+            'stack_id': stack.id,
44
+            'name': stack.stack_name,
45
+            'status': stack.stack_status,
46
+            'image': stack_image,
47
+            'image_size': 60,
48
+            'image_x': -30,
49
+            'image_y': -30,
50
+            'text_x': 40,
51
+            'text_y': ".35em",
52
+            'in_progress': True if (get_resource_status(stack.stack_status) ==
53
+                                   'IN_PROGRESS') else False,
54
+            'info_box': stack_info(stack, stack_image)
55
+        }
56
+        d3_data['stack'] = stack_node
57
+
58
+    if resources:
59
+        for resource in resources:
60
+            resource_image = get_resource_image(resource.resource_status,
61
+                                            resource.resource_type)
62
+            in_progress = True if (
63
+                get_resource_status(resource.resource_status)
64
+                == 'IN_PROGRESS') else False
65
+            resource_node = {
66
+                'name': resource.logical_resource_id,
67
+                'status': resource.resource_status,
68
+                'image': resource_image,
69
+                'required_by': resource.required_by,
70
+                'image_size': 50,
71
+                'image_x': -25,
72
+                'image_y': -25,
73
+                'text_x': 35,
74
+                'text_y': ".35em",
75
+                'in_progress': in_progress,
76
+                'info_box': resource_info(resource)
77
+            }
78
+            d3_data['nodes'].append(resource_node)
79
+    return json.dumps(d3_data)
80
+
81
+
82
+def get_d3_data(request, stack_id=''):
83
+    return HttpResponse(d3_data(request, stack_id=stack_id),
84
+                        content_type="application/json")

+ 62
- 0
openstack_dashboard/dashboards/project/stacks/mappings.py View File

@@ -14,6 +14,7 @@
14 14
 
15 15
 import json
16 16
 import logging
17
+import re
17 18
 import urlparse
18 19
 
19 20
 from django.core.urlresolvers import reverse
@@ -81,3 +82,64 @@ def stack_output(output):
81 82
         if parts.netloc and parts.scheme in ('http', 'https'):
82 83
             return u'<a href="%s" target="_blank">%s</a>' % (output, output)
83 84
     return unicode(output)
85
+
86
+
87
+resource_images = {
88
+    'LB_FAILED': '/static/dashboard/img/lb-red.svg',
89
+    'LB_DELETE': '/static/dashboard/img/lb-red.svg',
90
+    'LB_IN_PROGRESS': '/static/dashboard/img/lb-gray.gif',
91
+    'LB_COMPLETE': '/static/dashboard/img/lb-green.svg',
92
+    'DB_FAILED': '/static/dashboard/img/db-red.svg',
93
+    'DB_DELETE': '/static/dashboard/img/db-red.svg',
94
+    'DB_IN_PROGRESS': '/static/dashboard/img/db-gray.gif',
95
+    'DB_COMPLETE': '/static/dashboard/img/db-green.svg',
96
+    'STACK_FAILED': '/static/dashboard/img/stack-red.svg',
97
+    'STACK_DELETE': '/static/dashboard/img/stack-red.svg',
98
+    'STACK_IN_PROGRESS': '/static/dashboard/img/stack-gray.gif',
99
+    'STACK_COMPLETE': '/static/dashboard/img/stack-green.svg',
100
+    'SERVER_FAILED': '/static/dashboard/img/server-red.svg',
101
+    'SERVER_DELETE': '/static/dashboard/img/server-red.svg',
102
+    'SERVER_IN_PROGRESS': '/static/dashboard/img/server-gray.gif',
103
+    'SERVER_COMPLETE': '/static/dashboard/img/server-green.svg',
104
+    'UNKNOWN_FAILED': '/static/dashboard/img/unknown-red.svg',
105
+    'UNKNOWN_DELETE': '/static/dashboard/img/unknown-red.svg',
106
+    'UNKNOWN_IN_PROGRESS': '/static/dashboard/img/unknown-gray.gif',
107
+    'UNKNOWN_COMPLETE': '/static/dashboard/img/unknown-green.svg',
108
+}
109
+
110
+
111
+def get_resource_type(type):
112
+    if re.search('LoadBalancer', type):
113
+        return 'LB'
114
+    elif re.search('DBInstance', type):
115
+        return 'DB'
116
+    elif re.search('Instance', type):
117
+        return 'SERVER'
118
+    elif re.search('stack', type):
119
+        return 'STACK'
120
+    else:
121
+        return 'UNKNOWN'
122
+
123
+
124
+def get_resource_status(status):
125
+    if re.search('IN_PROGRESS', status):
126
+        return 'IN_PROGRESS'
127
+    elif re.search('FAILED', status):
128
+        return 'FAILED'
129
+    elif re.search('DELETE', status):
130
+        return 'DELETE'
131
+    else:
132
+        return 'COMPLETE'
133
+
134
+
135
+def get_resource_image(status, type):
136
+    '''
137
+    Sets the image url and in_progress action sw based on status.
138
+    '''
139
+    resource_type = get_resource_type(type)
140
+    resource_status = get_resource_status(status)
141
+    resource_state = resource_type + "_" + resource_status
142
+
143
+    for key in resource_images:
144
+        if key == resource_state:
145
+            return resource_images.get(key)

+ 31
- 0
openstack_dashboard/dashboards/project/stacks/sro.py View File

@@ -0,0 +1,31 @@
1
+from django.template.defaultfilters import title
2
+from django.template.loader import render_to_string
3
+
4
+from horizon.utils.filters import replace_underscores
5
+
6
+
7
+def stack_info(stack, stack_image):
8
+    stack.stack_status_desc = title(replace_underscores(stack.stack_status))
9
+    if stack.stack_status_reason:
10
+        stack.stack_status_reason = title(
11
+            replace_underscores(stack.stack_status_reason)
12
+        )
13
+    context = {}
14
+    context['stack'] = stack
15
+    context['stack_image'] = stack_image
16
+    return render_to_string('project/stacks/_stack_info.html',
17
+                            context)
18
+
19
+
20
+def resource_info(resource):
21
+    resource.resource_status_desc = title(
22
+        replace_underscores(resource.resource_status)
23
+    )
24
+    if resource.resource_status_reason:
25
+        resource.resource_status_reason = title(
26
+            replace_underscores(resource.resource_status_reason)
27
+        )
28
+    context = {}
29
+    context['resource'] = resource
30
+    return render_to_string('project/stacks/_resource_info.html',
31
+                            context)

+ 17
- 1
openstack_dashboard/dashboards/project/stacks/tabs.py View File

@@ -20,6 +20,7 @@ from horizon import messages
20 20
 from horizon import tabs
21 21
 from openstack_dashboard import api
22 22
 
23
+from openstack_dashboard.dashboards.project.stacks.api import d3_data
23 24
 from openstack_dashboard.dashboards.project.stacks.tables import EventsTable
24 25
 from openstack_dashboard.dashboards.project.stacks.tables import ResourcesTable
25 26
 
@@ -27,6 +28,20 @@ from openstack_dashboard.dashboards.project.stacks.tables import ResourcesTable
27 28
 LOG = logging.getLogger(__name__)
28 29
 
29 30
 
31
+class StackTopologyTab(tabs.Tab):
32
+    name = _("Topology")
33
+    slug = "topology"
34
+    template_name = "project/stacks/_detail_topology.html"
35
+    preload = False
36
+
37
+    def get_context_data(self, request):
38
+        context = {}
39
+        stack = self.tab_group.kwargs['stack']
40
+        context['stack_id'] = stack.id
41
+        context['d3_data'] = d3_data(request, stack_id=stack.id)
42
+        return context
43
+
44
+
30 45
 class StackOverviewTab(tabs.Tab):
31 46
     name = _("Overview")
32 47
     slug = "overview"
@@ -90,7 +105,8 @@ class StackResourcesTab(tabs.Tab):
90 105
 
91 106
 class StackDetailTabs(tabs.TabGroup):
92 107
     slug = "stack_details"
93
-    tabs = (StackOverviewTab, StackResourcesTab, StackEventsTab)
108
+    tabs = (StackTopologyTab, StackOverviewTab, StackResourcesTab,
109
+            StackEventsTab)
94 110
     sticky = True
95 111
 
96 112
 

+ 9
- 0
openstack_dashboard/dashboards/project/stacks/templates/stacks/_detail_topology.html View File

@@ -0,0 +1,9 @@
1
+{% load i18n sizeformat %}
2
+
3
+<div id="resource_container">
4
+    <div id="info_box"></div>
5
+    <div id="stack_box"></div>
6
+    <div id="heat_resource_topology"></div>
7
+    <div id="stack_id" data-stack_id="{{ stack_id }}"></div>
8
+    <div id="d3_data" data-d3_data="{{ d3_data }}"></div>
9
+</div>

+ 10
- 0
openstack_dashboard/dashboards/project/stacks/templates/stacks/_resource_info.html View File

@@ -0,0 +1,10 @@
1
+<h3>{{ resource.logical_resource_id }}</h3>
2
+
3
+{% if resource.resource_status == 'CREATE_FAILED' %}
4
+<p class="error">{{ resource.resource_status_desc }}</p>
5
+<p class="error">{{ resource.resource_status_reason }}</p>
6
+{% else %}
7
+<p>{{ resource.resource_status_desc }}</p>
8
+{% endif %}
9
+
10
+<p>{{ resource.resource_type }}</p>

+ 16
- 0
openstack_dashboard/dashboards/project/stacks/templates/stacks/_stack_info.html View File

@@ -0,0 +1,16 @@
1
+<img src="{{ stack_image }}" width="35px" height="35px" />
2
+<div id="stack_info">
3
+    <h3>{{ stack.stack_name }}</h3>
4
+    <p class="error">{{ stack.stack_status_desc }}</p>
5
+</div>
6
+<div class="clear"></div>
7
+{% if stack.stack_status == 'CREATE_FAILED' %}
8
+    <p class="error">{{ stack.stack_status_reason }}</p>
9
+{% else %}
10
+    <p>{{ stack.stack_status_desc }}</p>
11
+{% endif %}
12
+{% for output in stack.outputs %}
13
+    {% if output.output_key == 'WebsiteURL' %}
14
+    <a href="{{ output.output_value }}">{{ output.description }}</a>
15
+    {% endif %}
16
+{% endfor %}

+ 4
- 0
openstack_dashboard/dashboards/project/stacks/urls.py View File

@@ -15,6 +15,7 @@
15 15
 from django.conf.urls.defaults import patterns
16 16
 from django.conf.urls.defaults import url
17 17
 
18
+from openstack_dashboard.dashboards.project.stacks.api import get_d3_data
18 19
 from openstack_dashboard.dashboards.project.stacks.views import CreateStackView
19 20
 from openstack_dashboard.dashboards.project.stacks.views import DetailView
20 21
 from openstack_dashboard.dashboards.project.stacks.views import IndexView
@@ -32,4 +33,7 @@ urlpatterns = patterns(
32 33
     url(r'^stack/(?P<stack_id>[^/]+)/$', DetailView.as_view(), name='detail'),
33 34
     url(r'^stack/(?P<stack_id>[^/]+)/(?P<resource_name>[^/]+)/$',
34 35
         ResourceView.as_view(), name='resource'),
36
+
37
+    #AJAX urls
38
+    url(r'^get_d3_data/(?P<stack_id>[^/]+)/$', get_d3_data, name='d3_data')
35 39
 )

+ 2
- 0
openstack_dashboard/dashboards/project/stacks/views.py View File

@@ -102,6 +102,8 @@ class DetailView(tabs.TabView):
102 102
             try:
103 103
                 stack = api.heat.stack_get(request, stack_id)
104 104
                 self._stack = stack
105
+                request.session['stack_id'] = stack.id
106
+                request.session['stack_name'] = stack.stack_name
105 107
             except:
106 108
                 msg = _("Unable to retrieve stack.")
107 109
                 redirect = reverse('horizon:project:stacks:index')

BIN
openstack_dashboard/static/dashboard/img/db-gray.gif View File


+ 85
- 0
openstack_dashboard/static/dashboard/img/db-gray.svg View File

@@ -0,0 +1,85 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In  -->
3
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
4
+	<!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
5
+]>
6
+<svg version="1.1"
7
+	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
8
+	 x="0px" y="0px" width="92px" height="92px" viewBox="-3.1 -2.67 92 92" enable-background="new -3.1 -2.67 92 92"
9
+	 xml:space="preserve">
10
+<defs>
11
+</defs>
12
+<g id="XMLID_2_">
13
+	<g>
14
+		<path fill="#FFFFFF" d="M43.33,1.5c23.11,0,41.839,18.73,41.839,41.83c0,23.1-18.729,41.83-41.839,41.83
15
+			c-23.1,0-41.83-18.73-41.83-41.83C1.5,20.23,20.23,1.5,43.33,1.5z"/>
16
+	</g>
17
+	<g>
18
+		<path fill="none" stroke="#808080" stroke-width="3" stroke-miterlimit="10" d="M85.169,43.33c0,23.1-18.729,41.83-41.839,41.83
19
+			c-23.1,0-41.83-18.73-41.83-41.83C1.5,20.23,20.23,1.5,43.33,1.5C66.44,1.5,85.169,20.23,85.169,43.33z"/>
20
+	</g>
21
+</g>
22
+<g id="XMLID_1_">
23
+	<g>
24
+		<path fill="#808080" d="M63.49,52.5v3.99c0,3.75-8.8,6.78-19.67,6.78s-19.67-3.03-19.67-6.78V52.5c0.01,0.01,0.01,0.01,0.02,0.021
25
+			c0.31,3.649,8.98,6.579,19.65,6.579s19.34-2.93,19.65-6.579C63.48,52.51,63.48,52.51,63.49,52.5z"/>
26
+		<path fill="#FFFFFF" d="M63.49,48.33v3.98c0,0.069,0,0.14-0.02,0.21c-2.69,3.239-11.07,5.09-19.65,5.09s-16.96-1.851-19.65-5.09
27
+			c-0.02-0.07-0.02-0.141-0.02-0.21v-3.98c0.04,0.05,0.09,0.11,0.14,0.16c1.27,3.16,9.53,5.63,19.53,5.63
28
+			c9.92,0,18.13-2.43,19.48-5.58C63.37,48.47,63.43,48.4,63.49,48.33z"/>
29
+		<path fill="#FFFFFF" d="M63.49,30.42l-0.03,4.21c-2.72,3-11.119,4.66-19.64,4.66c-8.55,0-16.98-1.67-19.67-4.69v-4.18
30
+			c0.04,0.05,0.09,0.09,0.14,0.14c1.12,2.94,9.43,5.23,19.53,5.23c10.1,0,18.41-2.29,19.53-5.23C63.4,30.51,63.45,30.47,63.49,30.42
31
+			z"/>
32
+		<path fill="#808080" d="M63.49,34.6l-0.03,4.54c-0.029,0.13-0.069,0.26-0.119,0.39c-2.83,3.04-11.091,4.74-19.521,4.74
33
+			c-8.5,0-16.82-1.73-19.59-4.81c-0.03-0.09-0.06-0.19-0.08-0.28v-4.17c0.68,3.2,9.22,5.77,19.67,5.77
34
+			c10.45,0,18.99-2.57,19.64-5.82v-0.33C63.47,34.62,63.48,34.61,63.49,34.6z"/>
35
+		<path fill="#FFFFFF" d="M63.49,39.37l-0.02,4.2c-2.71,3.13-11.09,4.88-19.65,4.88c-8.58,0-16.98-1.76-19.67-4.9v-4.18
36
+			c0.03,0.03,0.05,0.06,0.08,0.09c1.1,3.07,9.44,5.5,19.59,5.5c10.03,0,18.29-2.37,19.521-5.43C63.4,39.48,63.44,39.42,63.49,39.37z
37
+			"/>
38
+		<path fill="#808080" d="M63.49,43.55l-0.02,4.4c-0.03,0.2-0.09,0.39-0.17,0.59c-2.86,3.12-11.07,4.9-19.48,4.9
39
+			c-8.46,0-16.71-1.801-19.53-4.95c-0.07-0.17-0.11-0.34-0.14-0.51V43.8c0.54,3.4,9.14,6.14,19.67,6.14
40
+			c10.53,0,19.13-2.74,19.65-6.17v-0.2C63.48,43.56,63.48,43.56,63.49,43.55z"/>
41
+		<path fill="#808080" d="M63.47,43.57v0.2c-0.521,3.43-9.12,6.17-19.65,6.17c-10.53,0-19.13-2.74-19.67-6.14v-0.25
42
+			c2.69,3.14,11.09,4.9,19.67,4.9C52.38,48.45,60.76,46.7,63.47,43.57z"/>
43
+		<path fill="#808080" d="M63.459,34.63v0.33c-0.649,3.25-9.189,5.82-19.64,5.82c-10.45,0-18.99-2.57-19.67-5.77V34.6
44
+			c2.69,3.02,11.12,4.69,19.67,4.69C52.34,39.29,60.74,37.63,63.459,34.63z"/>
45
+		<path fill="#636464" d="M63.49,29.87c0,0.23-0.04,0.46-0.14,0.69c-2.811,2.93-11.11,4.55-19.53,4.55s-16.72-1.62-19.53-4.55
46
+			c-0.1-0.23-0.14-0.46-0.14-0.69c0-3.27,8.8-5.92,19.67-5.92S63.49,26.6,63.49,29.87z"/>
47
+		<path fill="#636464" d="M63.35,30.56c-1.12,2.94-9.431,5.23-19.53,5.23c-10.1,0-18.41-2.29-19.53-5.23
48
+			c2.81,2.93,11.11,4.55,19.53,4.55S60.54,33.49,63.35,30.56z"/>
49
+		<path fill="#808080" d="M63.47,52.521C63.16,56.17,54.49,59.1,43.82,59.1s-19.34-2.93-19.65-6.579
50
+			c2.69,3.239,11.07,5.09,19.65,5.09S60.78,55.76,63.47,52.521z"/>
51
+		<path fill="#808080" d="M63.3,48.54c-1.351,3.15-9.561,5.58-19.48,5.58c-10,0-18.26-2.47-19.53-5.63
52
+			c2.82,3.149,11.07,4.95,19.53,4.95C52.23,53.44,60.44,51.66,63.3,48.54z"/>
53
+		<path fill="#808080" d="M63.34,39.53c-1.23,3.06-9.49,5.43-19.521,5.43c-10.15,0-18.49-2.43-19.59-5.5
54
+			c2.77,3.08,11.09,4.81,19.59,4.81C52.25,44.27,60.51,42.57,63.34,39.53z"/>
55
+	</g>
56
+	<g>
57
+		<path fill="none" stroke="#FFFFFF" stroke-linecap="square" stroke-linejoin="round" stroke-miterlimit="10" d="M63.35,30.56
58
+			c0.05-0.05,0.1-0.09,0.14-0.14l-0.03,4.21"/>
59
+		<path fill="none" stroke="#FFFFFF" stroke-linecap="square" stroke-linejoin="round" stroke-miterlimit="10" d="M24.15,34.6v-4.18
60
+			c0.04,0.05,0.09,0.09,0.14,0.14"/>
61
+		<path fill="none" stroke="#FFFFFF" stroke-linecap="square" stroke-linejoin="round" stroke-miterlimit="10" d="M63.3,48.54
62
+			c0.069-0.07,0.13-0.14,0.189-0.21v3.98c0,0.069,0,0.14-0.02,0.21"/>
63
+		<path fill="none" stroke="#FFFFFF" stroke-linecap="square" stroke-linejoin="round" stroke-miterlimit="10" d="M24.17,52.521
64
+			c-0.02-0.07-0.02-0.141-0.02-0.21v-3.98c0.04,0.05,0.09,0.11,0.14,0.16"/>
65
+		<path fill="none" stroke="#FFFFFF" stroke-linecap="square" stroke-linejoin="round" stroke-miterlimit="10" d="M24.15,43.55
66
+			v-4.18c0.03,0.03,0.05,0.06,0.08,0.09"/>
67
+		<path fill="none" stroke="#FFFFFF" stroke-linecap="square" stroke-linejoin="round" stroke-miterlimit="10" d="M63.34,39.53
68
+			c0.06-0.05,0.1-0.11,0.149-0.16l-0.02,4.2"/>
69
+		<path fill="none" stroke="#FFFFFF" stroke-linecap="square" stroke-linejoin="round" stroke-miterlimit="10" d="M24.23,39.46
70
+			c-0.03-0.09-0.06-0.19-0.08-0.28v-4.17V34.6c2.69,3.02,11.12,4.69,19.67,4.69c8.521,0,16.92-1.66,19.64-4.66
71
+			c0.011-0.01,0.021-0.02,0.03-0.03l-0.03,4.54c-0.029,0.13-0.069,0.26-0.119,0.39c-1.23,3.06-9.49,5.43-19.521,5.43
72
+			C33.67,44.96,25.33,42.53,24.23,39.46z"/>
73
+		<path fill="none" stroke="#FFFFFF" stroke-linecap="square" stroke-linejoin="round" stroke-miterlimit="10" d="M63.47,52.521
74
+			c0.01-0.011,0.01-0.011,0.02-0.021v3.99c0,3.75-8.8,6.78-19.67,6.78s-19.67-3.03-19.67-6.78V52.5c0.01,0.01,0.01,0.01,0.02,0.021
75
+			c2.69,3.239,11.07,5.09,19.65,5.09S60.78,55.76,63.47,52.521z"/>
76
+		<path fill="none" stroke="#FFFFFF" stroke-linecap="square" stroke-linejoin="round" stroke-miterlimit="10" d="M63.47,43.57
77
+			c0.01-0.01,0.01-0.01,0.02-0.02l-0.02,4.4c-0.03,0.2-0.09,0.39-0.17,0.59c-1.351,3.15-9.561,5.58-19.48,5.58
78
+			c-10,0-18.26-2.47-19.53-5.63c-0.07-0.17-0.11-0.34-0.14-0.51V43.8v-0.25c2.69,3.14,11.09,4.9,19.67,4.9
79
+			C52.38,48.45,60.76,46.7,63.47,43.57z"/>
80
+		<path fill="none" stroke="#FFFFFF" stroke-linecap="square" stroke-linejoin="round" stroke-miterlimit="10" d="M24.29,30.56
81
+			c-0.1-0.23-0.14-0.46-0.14-0.69c0-3.27,8.8-5.92,19.67-5.92s19.67,2.65,19.67,5.92c0,0.23-0.04,0.46-0.14,0.69
82
+			c-1.12,2.94-9.431,5.23-19.53,5.23C33.72,35.79,25.41,33.5,24.29,30.56z"/>
83
+	</g>
84
+</g>
85
+</svg>

+ 85
- 0
openstack_dashboard/static/dashboard/img/db-green.svg View File

@@ -0,0 +1,85 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In  -->
3
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
4
+	<!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
5
+]>
6
+<svg version="1.1"
7
+	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
8
+	 x="0px" y="0px" width="92px" height="92px" viewBox="-3.1 -2.67 92 92" enable-background="new -3.1 -2.67 92 92"
9
+	 xml:space="preserve">
10
+<defs>
11
+</defs>
12
+<g id="XMLID_2_">
13
+	<g>
14
+		<path fill="#FFFFFF" d="M43.33,1.5c23.11,0,41.839,18.73,41.839,41.83c0,23.1-18.729,41.83-41.839,41.83
15
+			c-23.1,0-41.83-18.73-41.83-41.83C1.5,20.23,20.23,1.5,43.33,1.5z"/>
16
+	</g>
17
+	<g>
18
+		<path fill="none" stroke="#186735" stroke-width="3" stroke-miterlimit="10" d="M85.169,43.33c0,23.1-18.729,41.83-41.839,41.83
19
+			c-23.1,0-41.83-18.73-41.83-41.83C1.5,20.23,20.23,1.5,43.33,1.5C66.44,1.5,85.169,20.23,85.169,43.33z"/>
20
+	</g>
21
+</g>
22
+<g id="XMLID_1_">
23
+	<g>
24
+		<path fill="#166734" d="M63.49,52.5v3.99c0,3.75-8.8,6.78-19.67,6.78s-19.67-3.03-19.67-6.78V52.5c0.01,0.01,0.01,0.01,0.02,0.021
25
+			c0.31,3.649,8.98,6.579,19.65,6.579s19.34-2.93,19.65-6.579C63.48,52.51,63.48,52.51,63.49,52.5z"/>
26
+		<path fill="#FFFFFF" d="M63.49,48.33v3.98c0,0.069,0,0.14-0.02,0.21c-2.69,3.239-11.07,5.09-19.65,5.09s-16.96-1.851-19.65-5.09
27
+			c-0.02-0.07-0.02-0.141-0.02-0.21v-3.98c0.04,0.05,0.09,0.11,0.14,0.16c1.27,3.16,9.53,5.63,19.53,5.63
28
+			c9.92,0,18.13-2.43,19.48-5.58C63.37,48.47,63.43,48.4,63.49,48.33z"/>
29
+		<path fill="#FFFFFF" d="M63.49,30.42l-0.03,4.21c-2.72,3-11.119,4.66-19.64,4.66c-8.55,0-16.98-1.67-19.67-4.69v-4.18
30
+			c0.04,0.05,0.09,0.09,0.14,0.14c1.12,2.94,9.43,5.23,19.53,5.23c10.1,0,18.41-2.29,19.53-5.23C63.4,30.51,63.45,30.47,63.49,30.42
31
+			z"/>
32
+		<path fill="#166734" d="M63.49,34.6l-0.03,4.54c-0.029,0.13-0.069,0.26-0.119,0.39c-2.83,3.04-11.091,4.74-19.521,4.74
33
+			c-8.5,0-16.82-1.73-19.59-4.81c-0.03-0.09-0.06-0.19-0.08-0.28v-4.17c0.68,3.2,9.22,5.77,19.67,5.77
34
+			c10.45,0,18.99-2.57,19.64-5.82v-0.33C63.47,34.62,63.48,34.61,63.49,34.6z"/>
35
+		<path fill="#FFFFFF" d="M63.49,39.37l-0.02,4.2c-2.71,3.13-11.09,4.88-19.65,4.88c-8.58,0-16.98-1.76-19.67-4.9v-4.18
36
+			c0.03,0.03,0.05,0.06,0.08,0.09c1.1,3.07,9.44,5.5,19.59,5.5c10.03,0,18.29-2.37,19.521-5.43C63.4,39.48,63.44,39.42,63.49,39.37z
37
+			"/>
38
+		<path fill="#166734" d="M63.49,43.55l-0.02,4.4c-0.03,0.2-0.09,0.39-0.17,0.59c-2.86,3.12-11.07,4.9-19.48,4.9
39
+			c-8.46,0-16.71-1.801-19.53-4.95c-0.07-0.17-0.11-0.34-0.14-0.51V43.8c0.54,3.4,9.14,6.14,19.67,6.14
40
+			c10.53,0,19.13-2.74,19.65-6.17v-0.2C63.48,43.56,63.48,43.56,63.49,43.55z"/>
41
+		<path fill="#0F8140" d="M63.47,43.57v0.2c-0.521,3.43-9.12,6.17-19.65,6.17c-10.53,0-19.13-2.74-19.67-6.14v-0.25
42
+			c2.69,3.14,11.09,4.9,19.67,4.9C52.38,48.45,60.76,46.7,63.47,43.57z"/>
43
+		<path fill="#0F8140" d="M63.459,34.63v0.33c-0.649,3.25-9.189,5.82-19.64,5.82c-10.45,0-18.99-2.57-19.67-5.77V34.6
44
+			c2.69,3.02,11.12,4.69,19.67,4.69C52.34,39.29,60.74,37.63,63.459,34.63z"/>
45
+		<path fill="#1F572B" d="M63.49,29.87c0,0.23-0.04,0.46-0.14,0.69c-2.811,2.93-11.11,4.55-19.53,4.55s-16.72-1.62-19.53-4.55
46
+			c-0.1-0.23-0.14-0.46-0.14-0.69c0-3.27,8.8-5.92,19.67-5.92S63.49,26.6,63.49,29.87z"/>
47
+		<path fill="#0F8140" d="M63.35,30.56c-1.12,2.94-9.431,5.23-19.53,5.23c-10.1,0-18.41-2.29-19.53-5.23
48
+			c2.81,2.93,11.11,4.55,19.53,4.55S60.54,33.49,63.35,30.56z"/>
49
+		<path fill="#0F8140" d="M63.47,52.521C63.16,56.17,54.49,59.1,43.82,59.1s-19.34-2.93-19.65-6.579
50
+			c2.69,3.239,11.07,5.09,19.65,5.09S60.78,55.76,63.47,52.521z"/>
51
+		<path fill="#0F8140" d="M63.3,48.54c-1.351,3.15-9.561,5.58-19.48,5.58c-10,0-18.26-2.47-19.53-5.63
52
+			c2.82,3.149,11.07,4.95,19.53,4.95C52.23,53.44,60.44,51.66,63.3,48.54z"/>
53
+		<path fill="#0F8140" d="M63.34,39.53c-1.23,3.06-9.49,5.43-19.521,5.43c-10.15,0-18.49-2.43-19.59-5.5
54
+			c2.77,3.08,11.09,4.81,19.59,4.81C52.25,44.27,60.51,42.57,63.34,39.53z"/>
55
+	</g>
56
+	<g>
57
+		<path fill="none" stroke="#FFFFFF" stroke-linecap="square" stroke-linejoin="round" stroke-miterlimit="10" d="M63.35,30.56
58
+			c0.05-0.05,0.1-0.09,0.14-0.14l-0.03,4.21"/>
59
+		<path fill="none" stroke="#FFFFFF" stroke-linecap="square" stroke-linejoin="round" stroke-miterlimit="10" d="M24.15,34.6v-4.18
60
+			c0.04,0.05,0.09,0.09,0.14,0.14"/>
61
+		<path fill="none" stroke="#FFFFFF" stroke-linecap="square" stroke-linejoin="round" stroke-miterlimit="10" d="M63.3,48.54
62
+			c0.069-0.07,0.13-0.14,0.189-0.21v3.98c0,0.069,0,0.14-0.02,0.21"/>
63
+		<path fill="none" stroke="#FFFFFF" stroke-linecap="square" stroke-linejoin="round" stroke-miterlimit="10" d="M24.17,52.521
64
+			c-0.02-0.07-0.02-0.141-0.02-0.21v-3.98c0.04,0.05,0.09,0.11,0.14,0.16"/>
65
+		<path fill="none" stroke="#FFFFFF" stroke-linecap="square" stroke-linejoin="round" stroke-miterlimit="10" d="M24.15,43.55
66
+			v-4.18c0.03,0.03,0.05,0.06,0.08,0.09"/>
67
+		<path fill="none" stroke="#FFFFFF" stroke-linecap="square" stroke-linejoin="round" stroke-miterlimit="10" d="M63.34,39.53
68
+			c0.06-0.05,0.1-0.11,0.149-0.16l-0.02,4.2"/>
69
+		<path fill="none" stroke="#FFFFFF" stroke-linecap="square" stroke-linejoin="round" stroke-miterlimit="10" d="M24.23,39.46
70
+			c-0.03-0.09-0.06-0.19-0.08-0.28v-4.17V34.6c2.69,3.02,11.12,4.69,19.67,4.69c8.521,0,16.92-1.66,19.64-4.66
71
+			c0.011-0.01,0.021-0.02,0.03-0.03l-0.03,4.54c-0.029,0.13-0.069,0.26-0.119,0.39c-1.23,3.06-9.49,5.43-19.521,5.43
72
+			C33.67,44.96,25.33,42.53,24.23,39.46z"/>
73
+		<path fill="none" stroke="#FFFFFF" stroke-linecap="square" stroke-linejoin="round" stroke-miterlimit="10" d="M63.47,52.521
74
+			c0.01-0.011,0.01-0.011,0.02-0.021v3.99c0,3.75-8.8,6.78-19.67,6.78s-19.67-3.03-19.67-6.78V52.5c0.01,0.01,0.01,0.01,0.02,0.021
75
+			c2.69,3.239,11.07,5.09,19.65,5.09S60.78,55.76,63.47,52.521z"/>
76
+		<path fill="none" stroke="#FFFFFF" stroke-linecap="square" stroke-linejoin="round" stroke-miterlimit="10" d="M63.47,43.57
77
+			c0.01-0.01,0.01-0.01,0.02-0.02l-0.02,4.4c-0.03,0.2-0.09,0.39-0.17,0.59c-1.351,3.15-9.561,5.58-19.48,5.58
78
+			c-10,0-18.26-2.47-19.53-5.63c-0.07-0.17-0.11-0.34-0.14-0.51V43.8v-0.25c2.69,3.14,11.09,4.9,19.67,4.9
79
+			C52.38,48.45,60.76,46.7,63.47,43.57z"/>
80
+		<path fill="none" stroke="#FFFFFF" stroke-linecap="square" stroke-linejoin="round" stroke-miterlimit="10" d="M24.29,30.56
81
+			c-0.1-0.23-0.14-0.46-0.14-0.69c0-3.27,8.8-5.92,19.67-5.92s19.67,2.65,19.67,5.92c0,0.23-0.04,0.46-0.14,0.69
82
+			c-1.12,2.94-9.431,5.23-19.53,5.23C33.72,35.79,25.41,33.5,24.29,30.56z"/>
83
+	</g>
84
+</g>
85
+</svg>

+ 85
- 0
openstack_dashboard/static/dashboard/img/db-red.svg View File

@@ -0,0 +1,85 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In  -->
3
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
4
+	<!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
5
+]>
6
+<svg version="1.1"
7
+	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
8
+	 x="0px" y="0px" width="92px" height="92px" viewBox="-3.1 -2.67 92 92" enable-background="new -3.1 -2.67 92 92"
9
+	 xml:space="preserve">
10
+<defs>
11
+</defs>
12
+<g id="XMLID_2_">
13
+	<g>
14
+		<path fill="#FFFFFF" d="M43.33,1.5c23.11,0,41.839,18.73,41.839,41.83c0,23.1-18.729,41.83-41.839,41.83
15
+			c-23.1,0-41.83-18.73-41.83-41.83C1.5,20.23,20.23,1.5,43.33,1.5z"/>
16
+	</g>
17
+	<g>
18
+		<path fill="none" stroke="#C82128" stroke-width="3" stroke-miterlimit="10" d="M85.169,43.33c0,23.1-18.729,41.83-41.839,41.83
19
+			c-23.1,0-41.83-18.73-41.83-41.83C1.5,20.23,20.23,1.5,43.33,1.5C66.44,1.5,85.169,20.23,85.169,43.33z"/>
20
+	</g>
21
+</g>
22
+<g id="XMLID_1_">
23
+	<g>
24
+		<path fill="#C82027" d="M63.49,52.5v3.99c0,3.75-8.8,6.78-19.67,6.78s-19.67-3.03-19.67-6.78V52.5c0.01,0.01,0.01,0.01,0.02,0.021
25
+			c0.31,3.649,8.98,6.579,19.65,6.579s19.34-2.93,19.65-6.579C63.48,52.51,63.48,52.51,63.49,52.5z"/>
26
+		<path fill="#FFFFFF" d="M63.49,48.33v3.98c0,0.069,0,0.14-0.02,0.21c-2.69,3.239-11.07,5.09-19.65,5.09s-16.96-1.851-19.65-5.09
27
+			c-0.02-0.07-0.02-0.141-0.02-0.21v-3.98c0.04,0.05,0.09,0.11,0.14,0.16c1.27,3.16,9.53,5.63,19.53,5.63
28
+			c9.92,0,18.13-2.43,19.48-5.58C63.37,48.47,63.43,48.4,63.49,48.33z"/>
29
+		<path fill="#FFFFFF" d="M63.49,30.42l-0.03,4.21c-2.72,3-11.119,4.66-19.64,4.66c-8.55,0-16.98-1.67-19.67-4.69v-4.18
30
+			c0.04,0.05,0.09,0.09,0.14,0.14c1.12,2.94,9.43,5.23,19.53,5.23c10.1,0,18.41-2.29,19.53-5.23C63.4,30.51,63.45,30.47,63.49,30.42
31
+			z"/>
32
+		<path fill="#C82027" d="M63.49,34.6l-0.03,4.54c-0.029,0.13-0.069,0.26-0.119,0.39c-2.83,3.04-11.091,4.74-19.521,4.74
33
+			c-8.5,0-16.82-1.73-19.59-4.81c-0.03-0.09-0.06-0.19-0.08-0.28v-4.17c0.68,3.2,9.22,5.77,19.67,5.77
34
+			c10.45,0,18.99-2.57,19.64-5.82v-0.33C63.47,34.62,63.48,34.61,63.49,34.6z"/>
35
+		<path fill="#FFFFFF" d="M63.49,39.37l-0.02,4.2c-2.71,3.13-11.09,4.88-19.65,4.88c-8.58,0-16.98-1.76-19.67-4.9v-4.18
36
+			c0.03,0.03,0.05,0.06,0.08,0.09c1.1,3.07,9.44,5.5,19.59,5.5c10.03,0,18.29-2.37,19.521-5.43C63.4,39.48,63.44,39.42,63.49,39.37z
37
+			"/>
38
+		<path fill="#C82027" d="M63.49,43.55l-0.02,4.4c-0.03,0.2-0.09,0.39-0.17,0.59c-2.86,3.12-11.07,4.9-19.48,4.9
39
+			c-8.46,0-16.71-1.801-19.53-4.95c-0.07-0.17-0.11-0.34-0.14-0.51V43.8c0.54,3.4,9.14,6.14,19.67,6.14
40
+			c10.53,0,19.13-2.74,19.65-6.17v-0.2C63.48,43.56,63.48,43.56,63.49,43.55z"/>
41
+		<path fill="#C82027" d="M63.47,43.57v0.2c-0.521,3.43-9.12,6.17-19.65,6.17c-10.53,0-19.13-2.74-19.67-6.14v-0.25
42
+			c2.69,3.14,11.09,4.9,19.67,4.9C52.38,48.45,60.76,46.7,63.47,43.57z"/>
43
+		<path fill="#C82027" d="M63.459,34.63v0.33c-0.649,3.25-9.189,5.82-19.64,5.82c-10.45,0-18.99-2.57-19.67-5.77V34.6
44
+			c2.69,3.02,11.12,4.69,19.67,4.69C52.34,39.29,60.74,37.63,63.459,34.63z"/>
45
+		<path fill="#9F1D20" d="M63.49,29.87c0,0.23-0.04,0.46-0.14,0.69c-2.811,2.93-11.11,4.55-19.53,4.55s-16.72-1.62-19.53-4.55
46
+			c-0.1-0.23-0.14-0.46-0.14-0.69c0-3.27,8.8-5.92,19.67-5.92S63.49,26.6,63.49,29.87z"/>
47
+		<path fill="#9F1D20" d="M63.35,30.56c-1.12,2.94-9.431,5.23-19.53,5.23c-10.1,0-18.41-2.29-19.53-5.23
48
+			c2.81,2.93,11.11,4.55,19.53,4.55S60.54,33.49,63.35,30.56z"/>
49
+		<path fill="#C82027" d="M63.47,52.521C63.16,56.17,54.49,59.1,43.82,59.1s-19.34-2.93-19.65-6.579
50
+			c2.69,3.239,11.07,5.09,19.65,5.09S60.78,55.76,63.47,52.521z"/>
51
+		<path fill="#C82027" d="M63.3,48.54c-1.351,3.15-9.561,5.58-19.48,5.58c-10,0-18.26-2.47-19.53-5.63
52
+			c2.82,3.149,11.07,4.95,19.53,4.95C52.23,53.44,60.44,51.66,63.3,48.54z"/>
53
+		<path fill="#C82027" d="M63.34,39.53c-1.23,3.06-9.49,5.43-19.521,5.43c-10.15,0-18.49-2.43-19.59-5.5
54
+			c2.77,3.08,11.09,4.81,19.59,4.81C52.25,44.27,60.51,42.57,63.34,39.53z"/>
55
+	</g>
56
+	<g>
57
+		<path fill="none" stroke="#FFFFFF" stroke-linecap="square" stroke-linejoin="round" stroke-miterlimit="10" d="M63.35,30.56
58
+			c0.05-0.05,0.1-0.09,0.14-0.14l-0.03,4.21"/>
59
+		<path fill="none" stroke="#FFFFFF" stroke-linecap="square" stroke-linejoin="round" stroke-miterlimit="10" d="M24.15,34.6v-4.18
60
+			c0.04,0.05,0.09,0.09,0.14,0.14"/>
61
+		<path fill="none" stroke="#FFFFFF" stroke-linecap="square" stroke-linejoin="round" stroke-miterlimit="10" d="M63.3,48.54
62
+			c0.069-0.07,0.13-0.14,0.189-0.21v3.98c0,0.069,0,0.14-0.02,0.21"/>
63
+		<path fill="none" stroke="#FFFFFF" stroke-linecap="square" stroke-linejoin="round" stroke-miterlimit="10" d="M24.17,52.521
64
+			c-0.02-0.07-0.02-0.141-0.02-0.21v-3.98c0.04,0.05,0.09,0.11,0.14,0.16"/>
65
+		<path fill="none" stroke="#FFFFFF" stroke-linecap="square" stroke-linejoin="round" stroke-miterlimit="10" d="M24.15,43.55
66
+			v-4.18c0.03,0.03,0.05,0.06,0.08,0.09"/>
67
+		<path fill="none" stroke="#FFFFFF" stroke-linecap="square" stroke-linejoin="round" stroke-miterlimit="10" d="M63.34,39.53
68
+			c0.06-0.05,0.1-0.11,0.149-0.16l-0.02,4.2"/>
69
+		<path fill="none" stroke="#FFFFFF" stroke-linecap="square" stroke-linejoin="round" stroke-miterlimit="10" d="M24.23,39.46
70
+			c-0.03-0.09-0.06-0.19-0.08-0.28v-4.17V34.6c2.69,3.02,11.12,4.69,19.67,4.69c8.521,0,16.92-1.66,19.64-4.66
71
+			c0.011-0.01,0.021-0.02,0.03-0.03l-0.03,4.54c-0.029,0.13-0.069,0.26-0.119,0.39c-1.23,3.06-9.49,5.43-19.521,5.43
72
+			C33.67,44.96,25.33,42.53,24.23,39.46z"/>
73
+		<path fill="none" stroke="#FFFFFF" stroke-linecap="square" stroke-linejoin="round" stroke-miterlimit="10" d="M63.47,52.521
74
+			c0.01-0.011,0.01-0.011,0.02-0.021v3.99c0,3.75-8.8,6.78-19.67,6.78s-19.67-3.03-19.67-6.78V52.5c0.01,0.01,0.01,0.01,0.02,0.021
75
+			c2.69,3.239,11.07,5.09,19.65,5.09S60.78,55.76,63.47,52.521z"/>
76
+		<path fill="none" stroke="#FFFFFF" stroke-linecap="square" stroke-linejoin="round" stroke-miterlimit="10" d="M63.47,43.57
77
+			c0.01-0.01,0.01-0.01,0.02-0.02l-0.02,4.4c-0.03,0.2-0.09,0.39-0.17,0.59c-1.351,3.15-9.561,5.58-19.48,5.58
78
+			c-10,0-18.26-2.47-19.53-5.63c-0.07-0.17-0.11-0.34-0.14-0.51V43.8v-0.25c2.69,3.14,11.09,4.9,19.67,4.9
79
+			C52.38,48.45,60.76,46.7,63.47,43.57z"/>
80
+		<path fill="none" stroke="#FFFFFF" stroke-linecap="square" stroke-linejoin="round" stroke-miterlimit="10" d="M24.29,30.56
81
+			c-0.1-0.23-0.14-0.46-0.14-0.69c0-3.27,8.8-5.92,19.67-5.92s19.67,2.65,19.67,5.92c0,0.23-0.04,0.46-0.14,0.69
82
+			c-1.12,2.94-9.431,5.23-19.53,5.23C33.72,35.79,25.41,33.5,24.29,30.56z"/>
83
+	</g>
84
+</g>
85
+</svg>

BIN
openstack_dashboard/static/dashboard/img/lb-gray.gif View File


+ 43
- 0
openstack_dashboard/static/dashboard/img/lb-gray.svg View File

@@ -0,0 +1,43 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In  -->
3
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
4
+	<!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
5
+]>
6
+<svg version="1.1"
7
+	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
8
+	 x="0px" y="0px" width="92px" height="92px" viewBox="-3.1 -2.67 92 92" enable-background="new -3.1 -2.67 92 92"
9
+	 xml:space="preserve">
10
+<defs>
11
+</defs>
12
+<g id="XMLID_3_">
13
+	<g>
14
+		<path fill="#FFFFFF" d="M43.33,1.5c23.11,0,41.839,18.73,41.839,41.83c0,23.1-18.729,41.83-41.839,41.83
15
+			c-23.1,0-41.83-18.73-41.83-41.83C1.5,20.23,20.23,1.5,43.33,1.5z"/>
16
+	</g>
17
+	<g>
18
+		<path fill="none" stroke="#808080" stroke-width="3" stroke-miterlimit="10" d="M85.169,43.33c0,23.1-18.729,41.83-41.839,41.83
19
+			c-23.1,0-41.83-18.73-41.83-41.83C1.5,20.23,20.23,1.5,43.33,1.5C66.44,1.5,85.169,20.23,85.169,43.33z"/>
20
+	</g>
21
+</g>
22
+<g id="XMLID_2_">
23
+	<g>
24
+		<path fill="#808080" d="M68.8,41.85v12.52H18.83V41.92c0-0.02,0.01-0.04,0.02-0.07H68.79C68.79,41.88,68.8,41.83,68.8,41.85z
25
+			 M55.31,48.36c0-1.11-0.9-2-2-2c-1.11,0-2,0.89-2,2c0,1.109,0.89,2,2,2C54.41,50.36,55.31,49.47,55.31,48.36z M46.31,48.36
26
+			c0-1.11-0.891-2-1.99-2c-1.11,0-2,0.89-2,2c0,1.109,0.89,2,2,2C45.419,50.36,46.31,49.47,46.31,48.36z M37.32,48.36
27
+			c0-1.11-0.89-2-2-2c-1.1,0-2,0.89-2,2c0,1.109,0.9,2,2,2C36.43,50.36,37.32,49.47,37.32,48.36z"/>
28
+		<polygon fill="#636464" points="61.82,32.33 68.79,41.85 18.85,41.85 25.81,32.33 		"/>
29
+		<path fill="#FFFFFF" d="M53.31,46.36c1.1,0,2,0.89,2,2c0,1.109-0.9,2-2,2c-1.11,0-2-0.891-2-2C51.31,47.25,52.2,46.36,53.31,46.36
30
+			z"/>
31
+		<path fill="#FFFFFF" d="M44.32,46.36c1.1,0,1.99,0.89,1.99,2c0,1.109-0.891,2-1.99,2c-1.11,0-2-0.891-2-2
32
+			C42.32,47.25,43.21,46.36,44.32,46.36z"/>
33
+		<path fill="#FFFFFF" d="M35.32,46.36c1.11,0,2,0.89,2,2c0,1.109-0.89,2-2,2c-1.1,0-2-0.891-2-2
34
+			C33.32,47.25,34.22,46.36,35.32,46.36z"/>
35
+	</g>
36
+	<g>
37
+		<polyline fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
38
+			68.79,41.85 61.82,32.33 25.81,32.33 18.85,41.85 		"/>
39
+		<path fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M18.85,41.85
40
+			c-0.01,0.03-0.02,0.05-0.02,0.07v12.45H68.8V41.85c0-0.02-0.011,0.03-0.011,0H18.85z"/>
41
+	</g>
42
+</g>
43
+</svg>

+ 43
- 0
openstack_dashboard/static/dashboard/img/lb-green.svg View File

@@ -0,0 +1,43 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In  -->
3
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
4
+	<!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
5
+]>
6
+<svg version="1.1"
7
+	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
8
+	 x="0px" y="0px" width="92px" height="92px" viewBox="-3.1 -2.67 92 92" enable-background="new -3.1 -2.67 92 92"
9
+	 xml:space="preserve">
10
+<defs>
11
+</defs>
12
+<g id="XMLID_3_">
13
+	<g>
14
+		<path fill="#FFFFFF" d="M43.33,1.5c23.11,0,41.839,18.73,41.839,41.83c0,23.1-18.729,41.83-41.839,41.83
15
+			c-23.1,0-41.83-18.73-41.83-41.83C1.5,20.23,20.23,1.5,43.33,1.5z"/>
16
+	</g>
17
+	<g>
18
+		<path fill="none" stroke="#156734" stroke-width="3" stroke-miterlimit="10" d="M85.169,43.33c0,23.1-18.729,41.83-41.839,41.83
19
+			c-23.1,0-41.83-18.73-41.83-41.83C1.5,20.23,20.23,1.5,43.33,1.5C66.44,1.5,85.169,20.23,85.169,43.33z"/>
20
+	</g>
21
+</g>
22
+<g id="XMLID_2_">
23
+	<g>
24
+		<path fill="#166734" d="M18.85,41.85H68.79c0,0.03,0.011-0.02,0.011,0v12.52H18.83V41.92C18.83,41.9,18.84,41.88,18.85,41.85z
25
+			 M55.31,48.36c0-1.11-0.9-2-2-2c-1.11,0-2,0.89-2,2c0,1.109,0.89,2,2,2C54.41,50.36,55.31,49.47,55.31,48.36z M46.31,48.36
26
+			c0-1.11-0.891-2-1.99-2c-1.11,0-2,0.89-2,2c0,1.109,0.89,2,2,2C45.419,50.36,46.31,49.47,46.31,48.36z M37.32,48.36
27
+			c0-1.11-0.89-2-2-2c-1.1,0-2,0.89-2,2c0,1.109,0.9,2,2,2C36.43,50.36,37.32,49.47,37.32,48.36z"/>
28
+		<path fill="#FFFFFF" d="M53.31,46.36c1.1,0,2,0.89,2,2c0,1.109-0.9,2-2,2c-1.11,0-2-0.891-2-2C51.31,47.25,52.2,46.36,53.31,46.36
29
+			z"/>
30
+		<path fill="#FFFFFF" d="M44.32,46.36c1.1,0,1.99,0.89,1.99,2c0,1.109-0.891,2-1.99,2c-1.11,0-2-0.891-2-2
31
+			C42.32,47.25,43.21,46.36,44.32,46.36z"/>
32
+		<path fill="#FFFFFF" d="M35.32,46.36c1.11,0,2,0.89,2,2c0,1.109-0.89,2-2,2c-1.1,0-2-0.891-2-2
33
+			C33.32,47.25,34.22,46.36,35.32,46.36z"/>
34
+		<polygon fill="#1F572B" points="18.85,41.85 25.81,32.33 61.82,32.33 68.79,41.85 		"/>
35
+	</g>
36
+	<g>
37
+		<polyline fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
38
+			68.79,41.85 61.82,32.33 25.81,32.33 18.85,41.85 		"/>
39
+		<path fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M18.85,41.85
40
+			c-0.01,0.03-0.02,0.05-0.02,0.07v12.45H68.8V41.85c0-0.02-0.011,0.03-0.011,0H18.85z"/>
41
+	</g>
42
+</g>
43
+</svg>

+ 43
- 0
openstack_dashboard/static/dashboard/img/lb-red.svg View File

@@ -0,0 +1,43 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In  -->
3
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
4
+	<!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
5
+]>
6
+<svg version="1.1"
7
+	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
8
+	 x="0px" y="0px" width="92px" height="92px" viewBox="-3.1 -2.67 92 92" enable-background="new -3.1 -2.67 92 92"
9
+	 xml:space="preserve">
10
+<defs>
11
+</defs>
12
+<g id="XMLID_3_">
13
+	<g>
14
+		<path fill="#FFFFFF" d="M43.33,1.5c23.11,0,41.839,18.73,41.839,41.83c0,23.1-18.729,41.83-41.839,41.83
15
+			c-23.1,0-41.83-18.73-41.83-41.83C1.5,20.23,20.23,1.5,43.33,1.5z"/>
16
+	</g>
17
+	<g>
18
+		<path fill="none" stroke="#C82128" stroke-width="3" stroke-miterlimit="10" d="M85.169,43.33c0,23.1-18.729,41.83-41.839,41.83
19
+			c-23.1,0-41.83-18.73-41.83-41.83C1.5,20.23,20.23,1.5,43.33,1.5C66.44,1.5,85.169,20.23,85.169,43.33z"/>
20
+	</g>
21
+</g>
22
+<g id="XMLID_2_">
23
+	<g>
24
+		<path fill="#C82027" d="M18.85,41.85H68.79c0,0.03,0.011-0.02,0.011,0v12.52H18.83V41.92C18.83,41.9,18.84,41.88,18.85,41.85z
25
+			 M55.31,48.36c0-1.11-0.9-2-2-2c-1.11,0-2,0.89-2,2c0,1.109,0.89,2,2,2C54.41,50.36,55.31,49.47,55.31,48.36z M46.31,48.36
26
+			c0-1.11-0.891-2-1.99-2c-1.11,0-2,0.89-2,2c0,1.109,0.89,2,2,2C45.419,50.36,46.31,49.47,46.31,48.36z M37.32,48.36
27
+			c0-1.11-0.89-2-2-2c-1.1,0-2,0.89-2,2c0,1.109,0.9,2,2,2C36.43,50.36,37.32,49.47,37.32,48.36z"/>
28
+		<path fill="#FFFFFF" d="M53.31,46.36c1.1,0,2,0.89,2,2c0,1.109-0.9,2-2,2c-1.11,0-2-0.891-2-2C51.31,47.25,52.2,46.36,53.31,46.36
29
+			z"/>
30
+		<path fill="#FFFFFF" d="M44.32,46.36c1.1,0,1.99,0.89,1.99,2c0,1.109-0.891,2-1.99,2c-1.11,0-2-0.891-2-2
31
+			C42.32,47.25,43.21,46.36,44.32,46.36z"/>
32
+		<path fill="#FFFFFF" d="M35.32,46.36c1.11,0,2,0.89,2,2c0,1.109-0.89,2-2,2c-1.1,0-2-0.891-2-2
33
+			C33.32,47.25,34.22,46.36,35.32,46.36z"/>
34
+		<polygon fill="#9F1D20" points="18.85,41.85 25.81,32.33 61.82,32.33 68.79,41.85 		"/>
35
+	</g>
36
+	<g>
37
+		<polyline fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
38
+			68.79,41.85 61.82,32.33 25.81,32.33 18.85,41.85 		"/>
39
+		<path fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M18.85,41.85
40
+			c-0.01,0.03-0.02,0.05-0.02,0.07v12.45H68.8V41.85c0-0.02-0.011,0.03-0.011,0H18.85z"/>
41
+	</g>
42
+</g>
43
+</svg>

BIN
openstack_dashboard/static/dashboard/img/server-gray.gif View File


+ 50
- 0
openstack_dashboard/static/dashboard/img/server-gray.svg View File

@@ -0,0 +1,50 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In  -->
3
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
4
+	<!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
5
+]>
6
+<svg version="1.1"
7
+	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
8
+	 x="0px" y="0px" width="92px" height="92px" viewBox="-3.1 -2.7 92 92" enable-background="new -3.1 -2.7 92 92"
9
+	 xml:space="preserve">
10
+<defs>
11
+</defs>
12
+<g id="XMLID_3_">
13
+	<g>
14
+		<path fill="#FFFFFF" d="M43.3,1.5c23.1,0,41.8,18.7,41.8,41.8c0,23.1-18.7,41.8-41.8,41.8c-23.1,0-41.8-18.7-41.8-41.8
15
+			C1.5,20.2,20.2,1.5,43.3,1.5z"/>
16
+	</g>
17
+	<g>
18
+		<path fill="none" stroke="#808080" stroke-width="3" stroke-miterlimit="10" d="M85.2,43.3c0,23.1-18.7,41.8-41.8,41.8
19
+			c-23.1,0-41.8-18.7-41.8-41.8c0-23.1,18.7-41.8,41.8-41.8C66.4,1.5,85.2,20.2,85.2,43.3z"/>
20
+	</g>
21
+</g>
22
+<g id="XMLID_1_">
23
+	<g>
24
+		<path fill="#808080" d="M68.6,42.4V55H39v-2.8h2V45v-2.6H68.6C68.5,42.5,68.6,42.4,68.6,42.4z M63,48.7c0-1.2-0.9-2.1-2-2.1
25
+			c-1.1,0-2,0.9-2,2.1c0,1.1,0.9,2.1,2,2.1C62.2,50.8,63,49.8,63,48.7z"/>
26
+		<polygon fill="#636464" points="61.6,33 68.5,42.4 41,42.4 18.5,42.4 25.5,33 		"/>
27
+		<path fill="#FFFFFF" d="M61,46.6c1.1,0,2,0.9,2,2.1c0,1.1-0.9,2.1-2,2.1c-1.1,0-2-0.9-2-2.1C59,47.5,59.9,46.6,61,46.6z"/>
28
+		<rect x="39" y="45" fill="#808080" width="2" height="7.3"/>
29
+		<path fill="#808080" d="M41,42.4V45h-2v7.3V55H18.5V42.5c0,0,0,0,0-0.1H41z M36,52.2V45h-2v7.3H36z M31,52.2V45h-2v7.3H31z
30
+			 M26,52.2V45h-2v7.3H26z"/>
31
+		<rect x="34" y="45" fill="#808080" width="2" height="7.3"/>
32
+		<rect x="29" y="45" fill="#808080" width="2" height="7.3"/>
33
+		<rect x="24" y="45" fill="#808080" width="2" height="7.3"/>
34
+	</g>
35
+	<g>
36
+		<polyline fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
37
+			68.5,42.4 61.6,33 25.5,33 18.5,42.4 		"/>
38
+		<path fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M39,55h29.5V42.4
39
+			c0,0,0,0,0,0H41H18.5c0,0,0,0.1,0,0.1V55H39z"/>
40
+		
41
+			<rect x="24" y="45" fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" width="2" height="7.3"/>
42
+		
43
+			<rect x="29" y="45" fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" width="2" height="7.3"/>
44
+		
45
+			<rect x="34" y="45" fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" width="2" height="7.3"/>
46
+		
47
+			<rect x="39" y="45" fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" width="2" height="7.3"/>
48
+	</g>
49
+</g>
50
+</svg>

+ 50
- 0
openstack_dashboard/static/dashboard/img/server-green.svg View File

@@ -0,0 +1,50 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In  -->
3
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
4
+	<!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
5
+]>
6
+<svg version="1.1"
7
+	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
8
+	 x="0px" y="0px" width="92px" height="92px" viewBox="-3.1 -2.7 92 92" enable-background="new -3.1 -2.7 92 92"
9
+	 xml:space="preserve">
10
+<defs>
11
+</defs>
12
+<g id="XMLID_3_">
13
+	<g>
14
+		<path fill="#FFFFFF" d="M43.3,1.5c23.1,0,41.8,18.7,41.8,41.8c0,23.1-18.7,41.8-41.8,41.8c-23.1,0-41.8-18.7-41.8-41.8
15
+			C1.5,20.2,20.2,1.5,43.3,1.5z"/>
16
+	</g>
17
+	<g>
18
+		<path fill="none" stroke="#156734" stroke-width="3" stroke-miterlimit="10" d="M85.2,43.3c0,23.1-18.7,41.8-41.8,41.8
19
+			c-23.1,0-41.8-18.7-41.8-41.8c0-23.1,18.7-41.8,41.8-41.8C66.4,1.5,85.2,20.2,85.2,43.3z"/>
20
+	</g>
21
+</g>
22
+<g id="XMLID_1_">
23
+	<g>
24
+		<polygon fill="#0F8140" points="61.6,33 68.5,42.4 41,42.4 18.5,42.4 25.5,33 		"/>
25
+		<path fill="#FFFFFF" d="M61,46.6c1.1,0,2,0.9,2,2.1c0,1.1-0.9,2.1-2,2.1c-1.1,0-2-0.9-2-2.1C59,47.5,59.9,46.6,61,46.6z"/>
26
+		<path fill="#156734" d="M63,48.7c0-1.2-0.9-2.1-2-2.1c-1.1,0-2,0.9-2,2.1c0,1.1,0.9,2.1,2,2.1C62.2,50.8,63,49.8,63,48.7z
27
+			 M68.6,42.4V55H39v-2.8h2V45v-2.6H68.6C68.5,42.5,68.6,42.4,68.6,42.4z"/>
28
+		<rect x="39" y="45" fill="#156734" width="2" height="7.3"/>
29
+		<rect x="34" y="45" fill="#156734" width="2" height="7.3"/>
30
+		<rect x="29" y="45" fill="#156734" width="2" height="7.3"/>
31
+		<rect x="24" y="45" fill="#156734" width="2" height="7.3"/>
32
+		<path fill="#156734" d="M24,52.2h2V45h-2V52.2z M29,52.2h2V45h-2V52.2z M18.5,42.4H41V45h-2v7.3V55H18.5L18.5,42.4
33
+			C18.5,42.5,18.5,42.5,18.5,42.4z M34,45v7.3h2V45H34z"/>
34
+	</g>
35
+	<g>
36
+		<polyline fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
37
+			68.5,42.4 61.6,33 25.5,33 18.5,42.4 		"/>
38
+		<path fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M39,55h29.5V42.4
39
+			c0,0,0,0,0,0H41H18.5c0,0,0,0.1,0,0.1V55H39z"/>
40
+		
41
+			<rect x="24" y="45" fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" width="2" height="7.3"/>
42
+		
43
+			<rect x="29" y="45" fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" width="2" height="7.3"/>
44
+		
45
+			<rect x="34" y="45" fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" width="2" height="7.3"/>
46
+		
47
+			<rect x="39" y="45" fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" width="2" height="7.3"/>
48
+	</g>
49
+</g>
50
+</svg>

+ 50
- 0
openstack_dashboard/static/dashboard/img/server-red.svg View File

@@ -0,0 +1,50 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In  -->
3
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
4
+	<!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
5
+]>
6
+<svg version="1.1"
7
+	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
8
+	 x="0px" y="0px" width="92px" height="92px" viewBox="-3.1 -2.7 92 92" enable-background="new -3.1 -2.7 92 92"
9
+	 xml:space="preserve">
10
+<defs>
11
+</defs>
12
+<g id="XMLID_3_">
13
+	<g>
14
+		<path fill="#FFFFFF" d="M43.3,1.5c23.1,0,41.8,18.7,41.8,41.8c0,23.1-18.7,41.8-41.8,41.8c-23.1,0-41.8-18.7-41.8-41.8
15
+			C1.5,20.2,20.2,1.5,43.3,1.5z"/>
16
+	</g>
17
+	<g>
18
+		<path fill="none" stroke="#C82027" stroke-width="3" stroke-miterlimit="10" d="M85.2,43.3c0,23.1-18.7,41.8-41.8,41.8
19
+			c-23.1,0-41.8-18.7-41.8-41.8c0-23.1,18.7-41.8,41.8-41.8C66.4,1.5,85.2,20.2,85.2,43.3z"/>
20
+	</g>
21
+</g>
22
+<g id="XMLID_1_">
23
+	<g>
24
+		<path fill="#C82027" d="M68.6,42.4V55H39v-2.8h2V45v-2.6H68.6C68.5,42.5,68.6,42.4,68.6,42.4z M63,48.7c0-1.2-0.9-2.1-2-2.1
25
+			c-1.1,0-2,0.9-2,2.1c0,1.1,0.9,2.1,2,2.1C62.2,50.8,63,49.8,63,48.7z"/>
26
+		<polygon fill="#9F1D20" points="61.6,33 68.5,42.4 41,42.4 18.5,42.4 25.5,33 		"/>
27
+		<path fill="#FFFFFF" d="M61,46.6c1.1,0,2,0.9,2,2.1c0,1.1-0.9,2.1-2,2.1c-1.1,0-2-0.9-2-2.1C59,47.5,59.9,46.6,61,46.6z"/>
28
+		<rect x="39" y="45" fill="#C82027" width="2" height="7.3"/>
29
+		<path fill="#C82027" d="M41,42.4V45h-2v7.3V55H18.5V42.5c0,0,0,0,0-0.1H41z M36,52.2V45h-2v7.3H36z M31,52.2V45h-2v7.3H31z
30
+			 M26,52.2V45h-2v7.3H26z"/>
31
+		<rect x="34" y="45" fill="#C82027" width="2" height="7.3"/>
32
+		<rect x="29" y="45" fill="#C82027" width="2" height="7.3"/>
33
+		<rect x="24" y="45" fill="#C82027" width="2" height="7.3"/>
34
+	</g>
35
+	<g>
36
+		<polyline fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
37
+			68.5,42.4 61.6,33 25.5,33 18.5,42.4 		"/>
38
+		<path fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M39,55h29.5V42.4
39
+			c0,0,0,0,0,0H41H18.5c0,0,0,0.1,0,0.1V55H39z"/>
40
+		
41
+			<rect x="24" y="45" fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" width="2" height="7.3"/>
42
+		
43
+			<rect x="29" y="45" fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" width="2" height="7.3"/>
44
+		
45
+			<rect x="34" y="45" fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" width="2" height="7.3"/>
46
+		
47
+			<rect x="39" y="45" fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" width="2" height="7.3"/>
48
+	</g>
49
+</g>
50
+</svg>

BIN
openstack_dashboard/static/dashboard/img/stack-gray.gif View File


+ 73
- 0
openstack_dashboard/static/dashboard/img/stack-gray.svg View File

@@ -0,0 +1,73 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In  -->
3
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
4
+	<!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
5
+]>
6
+<svg version="1.1"
7
+	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
8
+	 x="0px" y="0px" width="92px" height="92px" viewBox="-3.1 -2.7 92 92" enable-background="new -3.1 -2.7 92 92"
9
+	 xml:space="preserve">
10
+<defs>
11
+</defs>
12
+<circle fill="#FFFFFF" stroke="#808080" stroke-width="3" stroke-miterlimit="10" cx="43.3" cy="43.3" r="41.8"/>
13
+<g id="XMLID_6_">
14
+	<g>
15
+		<path fill="#808080" d="M68.5,51.9v12.6h-50V52c0,0,0,0,0-0.1H68.5C68.5,52,68.5,51.9,68.5,51.9z"/>
16
+		<polygon fill="#0F8140" points="61.6,42.5 68.5,51.9 18.5,51.9 25.5,42.5 		"/>
17
+	</g>
18
+	<g>
19
+		<polyline fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
20
+			68.5,51.9 61.6,42.5 25.5,42.5 18.5,51.9 		"/>
21
+		<path fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M18.5,51.9
22
+			C18.5,52,18.5,52,18.5,51.9l0,12.6h50V51.9c0,0,0,0,0,0H18.5z"/>
23
+		<line fill="none" stroke="#FFFFFF" stroke-miterlimit="10" x1="27" y1="55.5" x2="60" y2="55.5"/>
24
+		<line fill="none" stroke="#FFFFFF" stroke-miterlimit="10" x1="27" y1="58.5" x2="60" y2="58.5"/>
25
+		<line fill="none" stroke="#FFFFFF" stroke-miterlimit="10" x1="27" y1="61.5" x2="60" y2="61.5"/>
26
+	</g>
27
+</g>
28
+<g id="XMLID_5_">
29
+	<g>
30
+		<path fill="#808080" d="M68.5,39.4V52H39v-2.8h2V42v-2.6H68.5C68.5,39.5,68.5,39.4,68.5,39.4z M63,45.7c0-1.2-0.9-2.1-2-2.1
31
+			c-1.1,0-2,0.9-2,2.1c0,1.1,0.9,2.1,2,2.1C62.1,47.8,63,46.8,63,45.7z"/>
32
+		<polygon fill="#0F8140" points="61.6,30 68.5,39.4 41,39.4 18.5,39.4 25.5,30 		"/>
33
+		<path fill="#FFFFFF" d="M61,43.6c1.1,0,2,0.9,2,2.1c0,1.1-0.9,2.1-2,2.1c-1.1,0-2-0.9-2-2.1C59,44.5,59.9,43.6,61,43.6z"/>
34
+		<rect x="39" y="42" fill="#808080" width="2" height="7.3"/>
35
+		<path fill="#808080" d="M41,39.4V42h-2v7.3V52H18.5V39.5c0,0,0,0,0-0.1H41z M36,49.3V42h-2v7.3H36z M31,49.3V42h-2v7.3H31z
36
+			 M26,49.3V42h-2v7.3H26z"/>
37
+		<rect x="34" y="42" fill="#808080" width="2" height="7.3"/>
38
+		<rect x="29" y="42" fill="#808080" width="2" height="7.3"/>
39
+		<rect x="24" y="42" fill="#808080" width="2" height="7.3"/>
40
+	</g>
41
+	<g>
42
+		<polyline fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
43
+			68.5,39.4 61.6,30 25.5,30 18.5,39.4 		"/>
44
+		<path fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M39,52h29.5V39.4
45
+			c0,0,0,0,0,0H41H18.5c0,0,0,0.1,0,0.1V52H39z"/>
46
+		
47
+			<rect x="24" y="42" fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" width="2" height="7.3"/>
48
+		
49
+			<rect x="29" y="42" fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" width="2" height="7.3"/>
50
+		
51
+			<rect x="34" y="42" fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" width="2" height="7.3"/>
52
+		
53
+			<rect x="39" y="42" fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" width="2" height="7.3"/>
54
+	</g>
55
+</g>
56
+<g id="XMLID_4_">
57
+	<g>
58
+		<path fill="#808080" d="M68.5,27v12.5h-50V27.1c0,0,0,0,0-0.1H68.5C68.5,27,68.5,27,68.5,27z M55,33.5c0-1.1-0.9-2-2-2
59
+			c-1.1,0-2,0.9-2,2c0,1.1,0.9,2,2,2C54.1,35.5,55,34.6,55,33.5z M46,33.5c0-1.1-0.9-2-2-2c-1.1,0-2,0.9-2,2c0,1.1,0.9,2,2,2
60
+			C45.1,35.5,46,34.6,46,33.5z M37,33.5c0-1.1-0.9-2-2-2c-1.1,0-2,0.9-2,2c0,1.1,0.9,2,2,2C36.1,35.5,37,34.6,37,33.5z"/>
61
+		<polygon fill="#636565" points="61.5,17.5 68.5,27 18.5,27 25.5,17.5 		"/>
62
+		<path fill="#FFFFFF" d="M53,31.5c1.1,0,2,0.9,2,2c0,1.1-0.9,2-2,2c-1.1,0-2-0.9-2-2C51,32.4,51.9,31.5,53,31.5z"/>
63
+		<path fill="#FFFFFF" d="M44,31.5c1.1,0,2,0.9,2,2c0,1.1-0.9,2-2,2c-1.1,0-2-0.9-2-2C42,32.4,42.9,31.5,44,31.5z"/>
64
+		<path fill="#FFFFFF" d="M35,31.5c1.1,0,2,0.9,2,2c0,1.1-0.9,2-2,2c-1.1,0-2-0.9-2-2C33,32.4,33.9,31.5,35,31.5z"/>
65
+	</g>
66
+	<g>
67
+		<polyline fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="68.5,27 
68
+			61.5,17.5 25.5,17.5 18.5,27 		"/>
69
+		<path fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M18.5,27
70
+			C18.5,27,18.5,27.1,18.5,27l0,12.5h50V27c0,0,0,0,0,0H18.5z"/>
71
+	</g>
72
+</g>
73
+</svg>

+ 82
- 0
openstack_dashboard/static/dashboard/img/stack-green.svg View File

@@ -0,0 +1,82 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In  -->
3
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
4
+	<!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
5
+]>
6
+<svg version="1.1"
7
+	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
8
+	 x="0px" y="0px" width="92px" height="92px" viewBox="-3.1 -2.7 92 92" enable-background="new -3.1 -2.7 92 92"
9
+	 xml:space="preserve">
10
+<defs>
11
+</defs>
12
+<g id="XMLID_8_">
13
+	<g>
14
+		<path fill="#FFFFFF" d="M43.3,1.5c23.1,0,41.8,18.7,41.8,41.8c0,23.1-18.7,41.8-41.8,41.8c-23.1,0-41.8-18.7-41.8-41.8
15
+			C1.5,20.2,20.2,1.5,43.3,1.5z"/>
16
+	</g>
17
+	<g>
18
+		<path fill="none" stroke="#156734" stroke-width="3" stroke-miterlimit="10" d="M85.2,43.3c0,23.1-18.7,41.8-41.8,41.8
19
+			c-23.1,0-41.8-18.7-41.8-41.8c0-23.1,18.7-41.8,41.8-41.8C66.4,1.5,85.2,20.2,85.2,43.3z"/>
20
+	</g>
21
+</g>
22
+<g id="XMLID_7_">
23
+	<g>
24
+		<polygon fill="#0F8140" points="68.5,51.9 18.5,51.9 25.5,42.5 61.6,42.5 		"/>
25
+		<path fill="#156734" d="M68.6,64.5h-50V52c0,0,0,0,0-0.1h50c0,0,0,0,0,0V64.5z"/>
26
+	</g>
27
+	<g>
28
+		<polyline fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
29
+			68.5,51.9 61.6,42.5 25.5,42.5 18.5,51.9 		"/>
30
+		<path fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M18.5,51.9
31
+			C18.5,52,18.5,52,18.5,51.9l0,12.6h50V51.9c0,0,0,0,0,0H18.5z"/>
32
+		<line fill="none" stroke="#FFFFFF" stroke-miterlimit="10" x1="27" y1="55.5" x2="60" y2="55.5"/>
33
+		<line fill="none" stroke="#FFFFFF" stroke-miterlimit="10" x1="27" y1="58.5" x2="60" y2="58.5"/>
34
+		<line fill="none" stroke="#FFFFFF" stroke-miterlimit="10" x1="27" y1="61.5" x2="60" y2="61.5"/>
35
+	</g>
36
+</g>
37
+<g id="XMLID_6_">
38
+	<g>
39
+		<polygon fill="#0F8140" points="61.6,30 68.5,39.4 41,39.4 18.5,39.4 25.5,30 		"/>
40
+		<path fill="#FFFFFF" d="M61,43.6c1.1,0,2,0.9,2,2.1c0,1.1-0.9,2.1-2,2.1c-1.1,0-2-0.9-2-2.1C59,44.5,59.9,43.6,61,43.6z"/>
41
+		<path fill="#156734" d="M63,45.7c0-1.2-0.9-2.1-2-2.1c-1.1,0-2,0.9-2,2.1c0,1.1,0.9,2.1,2,2.1C62.2,47.8,63,46.8,63,45.7z
42
+			 M68.6,39.4V52H39v-2.8h2V42v-2.6H68.6C68.5,39.5,68.6,39.4,68.6,39.4z"/>
43
+		<rect x="39" y="42" fill="#156734" width="2" height="7.3"/>
44
+		<rect x="34" y="42" fill="#156734" width="2" height="7.3"/>
45
+		<rect x="29" y="42" fill="#156734" width="2" height="7.3"/>
46
+		<rect x="24" y="42" fill="#156734" width="2" height="7.3"/>
47
+		<path fill="#156734" d="M24,49.2h2V42h-2V49.2z M29,49.2h2V42h-2V49.2z M18.5,39.4H41V42h-2v7.3V52H18.5L18.5,39.4
48
+			C18.5,39.5,18.5,39.5,18.5,39.4z M34,42v7.3h2V42H34z"/>
49
+	</g>
50
+	<g>
51
+		<polyline fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
52
+			68.5,39.4 61.6,30 25.5,30 18.5,39.4 		"/>
53
+		<path fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M39,52h29.5V39.4
54
+			c0,0,0,0,0,0H41H18.5c0,0,0,0.1,0,0.1V52H39z"/>
55
+		
56
+			<rect x="24" y="42" fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" width="2" height="7.3"/>
57
+		
58
+			<rect x="29" y="42" fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" width="2" height="7.3"/>
59
+		
60
+			<rect x="34" y="42" fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" width="2" height="7.3"/>
61
+		
62
+			<rect x="39" y="42" fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" width="2" height="7.3"/>
63
+	</g>
64
+</g>
65
+<g id="XMLID_5_">
66
+	<g>
67
+		<path fill="#156734" d="M68.5,27v12.5h-50V27.1c0,0,0,0,0-0.1H68.5C68.5,27,68.5,27,68.5,27z M55,33.5c0-1.1-0.9-2-2-2
68
+			c-1.1,0-2,0.9-2,2c0,1.1,0.9,2,2,2C54.1,35.5,55,34.6,55,33.5z M46,33.5c0-1.1-0.9-2-2-2c-1.1,0-2,0.9-2,2c0,1.1,0.9,2,2,2
69
+			C45.1,35.5,46,34.6,46,33.5z M37,33.5c0-1.1-0.9-2-2-2c-1.1,0-2,0.9-2,2c0,1.1,0.9,2,2,2C36.1,35.5,37,34.6,37,33.5z"/>
70
+		<polygon fill="#1E572B" points="61.5,17.5 68.5,27 18.5,27 25.5,17.5 		"/>
71
+		<path fill="#FFFFFF" d="M53,31.5c1.1,0,2,0.9,2,2c0,1.1-0.9,2-2,2c-1.1,0-2-0.9-2-2C51,32.4,51.9,31.5,53,31.5z"/>
72
+		<path fill="#FFFFFF" d="M44,31.5c1.1,0,2,0.9,2,2c0,1.1-0.9,2-2,2c-1.1,0-2-0.9-2-2C42,32.4,42.9,31.5,44,31.5z"/>
73
+		<path fill="#FFFFFF" d="M35,31.5c1.1,0,2,0.9,2,2c0,1.1-0.9,2-2,2c-1.1,0-2-0.9-2-2C33,32.4,33.9,31.5,35,31.5z"/>
74
+	</g>
75
+	<g>
76
+		<polyline fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="68.5,27 
77
+			61.5,17.5 25.5,17.5 18.5,27 		"/>
78
+		<path fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M18.5,27
79
+			C18.5,27,18.5,27.1,18.5,27l0,12.5h50V27c0,0,0,0,0,0H18.5z"/>
80
+	</g>
81
+</g>
82
+</svg>

+ 92
- 0
openstack_dashboard/static/dashboard/img/stack-red.svg View File

@@ -0,0 +1,92 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
3
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
5
+	 width="90.5px" height="91px" viewBox="49 -16.5 90.5 91" enable-background="new 49 -16.5 90.5 91" xml:space="preserve">
6
+<title>Compute</title>
7
+<g>
8
+	<circle fill="#FFFFFF" stroke="#C90505" stroke-width="3" stroke-miterlimit="10" cx="93.934" cy="29.499" r="41.833"/>
9
+	<g>
10
+		<g>
11
+			<g id="XMLID_3_">
12
+				<g>
13
+					<path fill="#C90505" d="M119.15,50.666h-50.04v-12.5c0-0.01,0.01-0.04,0.01-0.08h50.01c0.01,0.04,0.02-0.02,0.02,0V50.666z"/>
14
+					<polygon fill="#008000" points="112.161,28.666 119.131,38.086 69.121,38.086 76.101,28.666 					"/>
15
+				</g>
16
+				<g>
17
+					<polyline fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
18
+						119.131,38.086 112.161,28.666 76.101,28.666 69.121,38.086 					"/>
19
+					<path fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M69.121,38.086
20
+						c0,0.04-0.01,0.07-0.01,0.08v12.5h50.04v-12.58c0-0.02-0.01,0.04-0.02,0H69.121z"/>
21
+					<line fill="none" stroke="#FFFFFF" stroke-miterlimit="10" x1="77.61" y1="41.666" x2="110.641" y2="41.666"/>
22
+					<line fill="none" stroke="#FFFFFF" stroke-miterlimit="10" x1="77.61" y1="44.666" x2="110.641" y2="44.666"/>
23
+					<line fill="none" stroke="#FFFFFF" stroke-miterlimit="10" x1="77.61" y1="47.666" x2="110.641" y2="47.666"/>
24
+				</g>
25
+			</g>
26
+		</g>
27
+		<g>
28
+			<title>Compute</title>
29
+			<g>
30
+				<g id="XMLID_2_">
31
+					<g>
32
+						<path fill="#C90505" d="M119.15,25.596v12.57H89.61v-2.75h2v-7.25v-2.57h27.521C119.141,25.626,119.15,25.576,119.15,25.596z
33
+							 M113.641,31.866c0-1.16-0.89-2.101-2-2.101c-1.1,0-2,0.94-2,2.101c0,1.149,0.9,2.09,2,2.09
34
+							C112.751,33.956,113.641,33.016,113.641,31.866z"/>
35
+						<polygon fill="#008000" points="112.161,16.166 119.131,25.596 91.61,25.596 69.121,25.596 76.101,16.166 						"/>
36
+						<path fill="#FFFFFF" d="M111.641,29.766c1.11,0,2,0.94,2,2.101c0,1.149-0.89,2.09-2,2.09c-1.1,0-2-0.94-2-2.09
37
+							C109.641,30.706,110.541,29.766,111.641,29.766z"/>
38
+						<rect x="89.61" y="28.166" fill="#C90505" width="2" height="7.25"/>
39
+						<rect x="84.61" y="28.166" fill="#C90505" width="2" height="7.25"/>
40
+						<rect x="79.61" y="28.166" fill="#C90505" width="2" height="7.25"/>
41
+						<rect x="74.611" y="28.166" fill="#C90505" width="2" height="7.25"/>
42
+						<path fill="#C90505" d="M74.611,35.416h2v-7.25h-2V35.416z M79.61,35.416h2v-7.25h-2V35.416z M84.61,35.416h2v-7.25h-2V35.416
43
+							z M89.61,28.166v7.25v2.75h-20.5v-12.49c0-0.02,0.01-0.05,0.01-0.08h22.49v2.57H89.61z"/>
44
+					</g>
45
+					<g>
46
+						<polyline fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
47
+							119.131,25.596 112.161,16.166 76.101,16.166 69.121,25.596 						"/>
48
+						<path fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M89.61,38.166
49
+							h29.54v-12.57c0-0.02-0.01,0.03-0.02,0H91.61h-22.49c0,0.03-0.01,0.061-0.01,0.08v12.49H89.61z"/>
50
+						
51
+							<rect x="74.611" y="28.166" fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" width="2" height="7.25"/>
52
+						
53
+							<rect x="79.61" y="28.166" fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" width="2" height="7.25"/>
54
+						
55
+							<rect x="84.61" y="28.166" fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" width="2" height="7.25"/>
56
+						
57
+							<rect x="89.61" y="28.166" fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" width="2" height="7.25"/>
58
+					</g>
59
+				</g>
60
+			</g>
61
+		</g>
62
+		<g>
63
+			<title>Load Balancer</title>
64
+			<g>
65
+				<g id="XMLID_1_">
66
+					<g>
67
+						<path fill="#C90505" d="M119.081,13.186v12.52h-49.97v-12.45c0-0.02,0.01-0.04,0.02-0.07h49.939
68
+							C119.07,13.216,119.081,13.166,119.081,13.186z M105.591,19.696c0-1.11-0.9-2-2-2c-1.11,0-2,0.89-2,2c0,1.11,0.89,2,2,2
69
+							C104.69,21.696,105.591,20.806,105.591,19.696z M96.591,19.696c0-1.11-0.891-2-1.99-2c-1.11,0-2,0.89-2,2c0,1.11,0.89,2,2,2
70
+							C95.7,21.696,96.591,20.806,96.591,19.696z M87.601,19.696c0-1.11-0.89-2-2-2c-1.1,0-2,0.89-2,2c0,1.11,0.9,2,2,2
71
+							C86.711,21.696,87.601,20.806,87.601,19.696z"/>
72
+						<polygon fill="#A00202" points="112.101,3.666 119.07,13.186 69.131,13.186 76.091,3.666 						"/>
73
+						<path fill="#FFFFFF" d="M103.591,17.696c1.1,0,2,0.89,2,2c0,1.11-0.9,2-2,2c-1.11,0-2-0.89-2-2
74
+							C101.591,18.586,102.48,17.696,103.591,17.696z"/>
75
+						<path fill="#FFFFFF" d="M94.601,17.696c1.1,0,1.99,0.89,1.99,2c0,1.11-0.891,2-1.99,2c-1.11,0-2-0.89-2-2
76
+							C92.601,18.586,93.49,17.696,94.601,17.696z"/>
77
+						<path fill="#FFFFFF" d="M85.601,17.696c1.11,0,2,0.89,2,2c0,1.11-0.89,2-2,2c-1.1,0-2-0.89-2-2
78
+							C83.601,18.586,84.501,17.696,85.601,17.696z"/>
79
+					</g>
80
+					<g>
81
+						<polyline fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
82
+							119.07,13.186 112.101,3.666 76.091,3.666 69.131,13.186 						"/>
83
+						<path fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M69.131,13.186
84
+							c-0.01,0.03-0.02,0.05-0.02,0.07v12.45h49.97v-12.52c0-0.02-0.011,0.03-0.011,0H69.131z"/>
85
+					</g>
86
+				</g>
87
+			</g>
88
+		</g>
89
+	</g>
90
+</g>
91
+<line fill="none" x1="41" y1="42.25" x2="90.969" y2="42.25"/>
92
+</svg>

BIN
openstack_dashboard/static/dashboard/img/unknown-gray.gif View File


+ 33
- 0
openstack_dashboard/static/dashboard/img/unknown-green.svg View File

@@ -0,0 +1,33 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In  -->
3
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
4
+	<!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
5
+]>
6
+<svg version="1.1"
7
+	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
8
+	 x="0px" y="0px" width="92px" height="92px" viewBox="-3.1 -2.67 92 92" enable-background="new -3.1 -2.67 92 92"
9
+	 xml:space="preserve">
10
+<defs>
11
+</defs>
12
+<g id="XMLID_1_">
13
+	<g>
14
+		<path fill="#FFFFFF" d="M43.33,1.5c23.11,0,41.839,18.73,41.839,41.83c0,23.1-18.729,41.83-41.839,41.83
15
+			c-23.1,0-41.83-18.73-41.83-41.83C1.5,20.23,20.23,1.5,43.33,1.5z"/>
16
+	</g>
17
+	<g>
18
+		<path fill="none" stroke="#186735" stroke-width="3" stroke-miterlimit="10" d="M85.169,43.33c0,23.1-18.729,41.83-41.839,41.83
19
+			c-23.1,0-41.83-18.73-41.83-41.83C1.5,20.23,20.23,1.5,43.33,1.5C66.44,1.5,85.169,20.23,85.169,43.33z"/>
20
+	</g>
21
+</g>
22
+<rect x="26.899" y="28.166" fill="none" stroke="#186735" stroke-miterlimit="10" width="13.333" height="13.333"/>
23
+<rect x="40.232" y="40.966" fill="none" stroke="#186735" stroke-miterlimit="10" width="13.334" height="13.333"/>
24
+<rect x="26.899" y="40.966" fill="#21572C" stroke="#186735" stroke-miterlimit="10" width="13.334" height="13.333"/>
25
+<rect x="40.232" y="28.166" fill="#21572C" stroke="#186735" stroke-miterlimit="10" width="13.334" height="13.333"/>
26
+<rect x="46.634" y="35.5" fill="#FFFFFF" stroke="#186735" stroke-miterlimit="10" width="13.332" height="13.334"/>
27
+<rect x="33.833" y="48.832" fill="#FFFFFF" stroke="#186735" stroke-miterlimit="10" width="13.334" height="13.334"/>
28
+<rect x="33.833" y="35.5" fill="#21572C" stroke="#186735" stroke-miterlimit="10" width="13.334" height="13.334"/>
29
+<rect x="46.634" y="48.832" fill="#21572C" stroke="#186735" stroke-miterlimit="10" width="13.332" height="13.334"/>
30
+<line fill="none" stroke="#186735" stroke-miterlimit="10" x1="33.833" y1="62.166" x2="26.899" y2="54.299"/>
31
+<line fill="none" stroke="#186735" stroke-miterlimit="10" x1="33.833" y1="35.5" x2="26.899" y2="28.166"/>
32
+<line fill="none" stroke="#186735" stroke-miterlimit="10" x1="59.966" y1="35.5" x2="53.566" y2="28.166"/>
33
+</svg>

+ 33
- 0
openstack_dashboard/static/dashboard/img/unknown-red.svg View File

@@ -0,0 +1,33 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In  -->
3
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
4
+	<!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
5
+]>
6
+<svg version="1.1"
7
+	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
8
+	 x="0px" y="0px" width="92px" height="92px" viewBox="-3.1 -2.67 92 92" enable-background="new -3.1 -2.67 92 92"
9
+	 xml:space="preserve">
10
+<defs>
11
+</defs>
12
+<g id="XMLID_1_">
13
+	<g>
14
+		<path fill="#FFFFFF" d="M43.33,1.5c23.11,0,41.839,18.73,41.839,41.83c0,23.1-18.729,41.83-41.839,41.83
15
+			c-23.1,0-41.83-18.73-41.83-41.83C1.5,20.23,20.23,1.5,43.33,1.5z"/>
16
+	</g>
17
+	<g>
18
+		<path fill="none" stroke="#C82128" stroke-width="3" stroke-miterlimit="10" d="M85.169,43.33c0,23.1-18.729,41.83-41.839,41.83
19
+			c-23.1,0-41.83-18.73-41.83-41.83C1.5,20.23,20.23,1.5,43.33,1.5C66.44,1.5,85.169,20.23,85.169,43.33z"/>
20
+	</g>
21
+</g>
22
+<rect x="26.899" y="28.166" fill="none" stroke="#C82128" stroke-miterlimit="10" width="13.333" height="13.333"/>
23
+<rect x="40.232" y="40.966" fill="none" stroke="#186735" stroke-miterlimit="10" width="13.334" height="13.333"/>
24
+<rect x="26.899" y="40.966" fill="#9F1E22" stroke="#C82128" stroke-miterlimit="10" width="13.334" height="13.333"/>
25
+<rect x="40.232" y="28.166" fill="#9F1E22" stroke="#C82128" stroke-miterlimit="10" width="13.334" height="13.333"/>
26
+<rect x="46.634" y="35.5" fill="#FFFFFF" stroke="#C82128" stroke-miterlimit="10" width="13.332" height="13.334"/>
27
+<rect x="33.833" y="48.832" fill="#FFFFFF" stroke="#C82128" stroke-miterlimit="10" width="13.334" height="13.334"/>
28
+<rect x="33.833" y="35.5" fill="#9F1E22" stroke="#C82128" stroke-miterlimit="10" width="13.334" height="13.334"/>
29
+<rect x="46.634" y="48.832" fill="#9F1E22" stroke="#C82128" stroke-miterlimit="10" width="13.332" height="13.334"/>
30
+<line fill="none" stroke="#C82128" stroke-miterlimit="10" x1="33.833" y1="62.166" x2="26.899" y2="54.299"/>
31
+<line fill="none" stroke="#C82128" stroke-miterlimit="10" x1="33.833" y1="35.5" x2="26.899" y2="28.166"/>
32
+<line fill="none" stroke="#C82128" stroke-miterlimit="10" x1="59.966" y1="35.5" x2="53.566" y2="28.166"/>
33
+</svg>

+ 18
- 2
openstack_dashboard/static/dashboard/less/horizon.less View File

@@ -2085,5 +2085,21 @@ div.network {
2085 2085
   }
2086 2086
 }
2087 2087
 
2088
-
2089
-
2088
+/**** Resource Topology CSS ****/
2089
+.link {stroke: #000;stroke-width: 1.5px;}
2090
+.node {cursor:pointer;}
2091
+.node text {font: 12px sans-serif;}
2092
+
2093
+#resource_container {position:relative;}
2094
+#stack_box {position:absolute;width:300px;top:10px;left:10px;}
2095
+#stack_box h3 {font-size:11pt;line-height:20px;}
2096
+#stack_box p {margin:0;font-size:9pt;line-height:14px;}
2097
+#stack_box a {margin:0;font-size:9pt;line-height:14px;}
2098
+#stack_box img {float:left;}
2099
+#stack_box #stack_info {float:left;white-space:normal;width:200px;}
2100
+
2101
+#info_box {position:absolute;width:300px;top:100px;left:10px;}
2102
+#info_box h3 {font-size:9pt;line-height:20px;}
2103
+#info_box p {margin:0;font-size:9pt;line-height:14px;}
2104
+#info_box a {margin:0;font-size:9pt;line-height:14px;}
2105
+#info_box .error {color:darkred;}

Loading…
Cancel
Save