magnum-ui 15.0.0.0rc1__py3-none-any.whl → 16.0.0.0rc1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
magnum_ui/api/magnum.py CHANGED
@@ -289,3 +289,8 @@ def quotas_update(request, project_id, resource, **kwargs):
289
289
 
290
290
  def quotas_delete(request, project_id, resource):
291
291
  return magnumclient(request).quotas.delete(project_id, resource)
292
+
293
+
294
+ def nodegroup_list(request, cluster_id=None, limit=None, marker=None):
295
+ return magnumclient(request).nodegroups.list(cluster_id, limit=limit,
296
+ marker=marker)
@@ -25,6 +25,7 @@ from django.views import generic
25
25
  from magnum_ui.api import heat
26
26
  from magnum_ui.api import magnum
27
27
 
28
+ from heatclient import exc as heatexc
28
29
  from openstack_dashboard import api
29
30
  from openstack_dashboard.api import neutron
30
31
  from openstack_dashboard.api.rest import urls
@@ -237,18 +238,29 @@ class ClusterResize(generic.View):
237
238
  print(e)
238
239
  return HttpResponseNotFound()
239
240
 
240
- stack = heat.stack_get(request, cluster["stack_id"])
241
- search_opts = {"name": "%s-" % stack.stack_name}
242
- servers = api.nova.server_list(request, search_opts=search_opts)[0]
241
+ try:
242
+ ngs = magnum.nodegroup_list(request, cluster_id)
243
+ nodegroups = [n.to_dict() for n in ngs]
244
+ except AttributeError:
245
+ return HttpResponseNotFound()
243
246
 
247
+ try:
248
+ stack = heat.stack_get(request, cluster["stack_id"])
249
+ except heatexc.HTTPNotFound:
250
+ stack = None
244
251
  worker_nodes = []
245
- for server in servers:
246
- if (server.name.startswith("%s-minion" % stack.stack_name) or
247
- server.name.startswith("%s-node" % stack.stack_name)):
248
- worker_nodes.append({"name": server.name, "id": server.id})
252
+ if stack:
253
+ search_opts = {"name": "%s-" % stack.stack_name}
254
+ servers = api.nova.server_list(request, search_opts=search_opts)[0]
255
+
256
+ for server in servers:
257
+ if (server.name.startswith("%s-minion" % stack.stack_name) or
258
+ server.name.startswith("%s-node" % stack.stack_name)):
259
+ worker_nodes.append({"name": server.name, "id": server.id})
249
260
 
250
261
  return {"cluster": change_to_id(cluster),
251
- "worker_nodes": worker_nodes}
262
+ "worker_nodes": worker_nodes,
263
+ "nodegroups": nodegroups}
252
264
 
253
265
  @rest_utils.ajax(data_required=True)
254
266
  def post(self, request, cluster_id):
@@ -99,7 +99,6 @@
99
99
  name: model.name,
100
100
  cluster_template_id: model.cluster_template_id,
101
101
  keypair: model.keypair,
102
- floating_ip_enabled: model.floating_ip_enabled,
103
102
  labels: requestLabels,
104
103
  master_lb_enabled: model.master_lb_enabled
105
104
  };
@@ -126,6 +125,10 @@
126
125
  requestLabels.availability_zone = model.availability_zone;
127
126
  requestLabels.auto_scaling_enabled = model.auto_scaling_enabled;
128
127
  requestLabels.auto_healing_enabled = model.auto_healing_enabled;
128
+ requestLabels.master_lb_floating_ip_enabled = model.master_lb_floating_ip_enabled;
129
+ if (model.api_master_lb_allowed_cidrs !== '') {
130
+ requestLabels.api_master_lb_allowed_cidrs = model.api_master_lb_allowed_cidrs;
131
+ }
129
132
 
130
133
  if (model.auto_scaling_enabled) {
131
134
  requestLabels.min_node_count = model.min_node_count;
@@ -70,7 +70,7 @@
70
70
  formModel = getFormModelDefaults();
71
71
  formModel.id = selected.id;
72
72
 
73
- modalConfig = constructModalConfig(response.data.worker_nodes);
73
+ modalConfig = constructModalConfig(response.data.nodegroups, response.data.worker_nodes);
74
74
 
75
75
  deferred.resolve(modal.open(modalConfig).then(onModalSubmit));
76
76
  $scope.model = formModel;
@@ -91,9 +91,13 @@
91
91
  return $qExtensions.booleanAsPromise(true);
92
92
  }
93
93
 
94
- function constructModalConfig(workerNodesList) {
95
- formModel.original_node_count = workerNodesList.length;
96
- formModel.node_count = workerNodesList.length;
94
+ function constructModalConfig(nodegroups, workerNodesList) {
95
+ var defaultWorker = nodegroups.filter(function(ng) {
96
+ return ng.name === 'default-worker';
97
+ })[0];
98
+ formModel.original_node_count = defaultWorker.node_count;
99
+ formModel.node_count = defaultWorker.node_count;
100
+ formModel.worker_nodes = workerNodesList;
97
101
 
98
102
  return {
99
103
  title: gettext('Resize Cluster'),
@@ -116,8 +120,8 @@
116
120
  form: [
117
121
  {
118
122
  key: 'node_count',
119
- title: gettext('Node Count'),
120
- placeholder: gettext('The cluster node count.'),
123
+ title: gettext('Node Count (default-worker)'),
124
+ placeholder: gettext('The default-worker nodegroup node_count.'),
121
125
  required: true,
122
126
  validationMessage: {
123
127
  101: gettext('You cannot resize to fewer than zero worker nodes.')
@@ -129,7 +133,8 @@
129
133
  type: 'checkboxes',
130
134
  title: gettext('Choose nodes to remove (Optional)'),
131
135
  titleMap: generateNodesTitleMap(workerNodesList),
132
- condition: 'model.node_count < model.original_node_count',
136
+ condition: 'model.node_count < model.original_node_count && ' +
137
+ 'model.worker_nodes.length > 0',
133
138
  onChange: validateNodeRemovalCount,
134
139
  validationMessage: {
135
140
  nodeRemovalCountExceeded: gettext('You may only select as many nodes ' +
@@ -67,10 +67,23 @@
67
67
 
68
68
  it('should open the modal, hide the loading spinner and check the form model',
69
69
  inject(function($timeout) {
70
- var mockWorkerNodes = [{id: "456", name: "Worker Node 1"}];
70
+ // 2 nodegroups, default-worker and another-nodegroup, with 2 and 3
71
+ // nodes respectively. cluster.node_count will be total nodes in all
72
+ // nodegroups
73
+ var mockDefaultWorker = {name: 'default-worker', node_count: 2};
74
+ var mockNodegroups = [mockDefaultWorker,
75
+ {name: 'default-master', node_count: 1},
76
+ {name: 'another-nodegroup', node_count: 3}];
77
+ var mockCluster = {node_count: 5};
78
+
79
+ // only populated with heat, [] for capi
80
+ var mockWorkerNodes = [{id: "456", name: "Worker Node 1"},
81
+ {id: "457", name: "Worker Node 2"}];
71
82
 
72
83
  deferred = $q.defer();
73
- deferred.resolve({data: {cluster: {}, worker_nodes: mockWorkerNodes}});
84
+ deferred.resolve({data: {cluster: mockCluster,
85
+ worker_nodes: mockWorkerNodes,
86
+ nodegroups: mockNodegroups}});
74
87
  spyOn(magnum, 'getClusterNodes').and.returnValue(deferred.promise);
75
88
 
76
89
  service.perform(selected, $scope);
@@ -82,8 +95,8 @@
82
95
 
83
96
  // Check if the form's model skeleton is correct
84
97
  expect(modalConfig.model.id).toBe(selected.id);
85
- expect(modalConfig.model.original_node_count).toBe(mockWorkerNodes.length);
86
- expect(modalConfig.model.node_count).toBe(mockWorkerNodes.length);
98
+ expect(modalConfig.model.original_node_count).toBe(mockDefaultWorker.node_count);
99
+ expect(modalConfig.model.node_count).toBe(mockDefaultWorker.node_count);
87
100
  expect(modalConfig.title).toBeDefined();
88
101
  expect(modalConfig.schema).toBeDefined();
89
102
  expect(modalConfig.form).toBeDefined();
@@ -85,10 +85,7 @@
85
85
  setResponseAsDefaultIfUnset('master_flavor_id', 'master_flavor_id');
86
86
  setResponseAsDefaultIfUnset('node_count', 'node_count');
87
87
  setResponseAsDefaultIfUnset('flavor_id', 'flavor_id');
88
-
89
- if (template.floating_ip_enabled !== null) {
90
- $scope.model.floating_ip_enabled = template.floating_ip_enabled;
91
- }
88
+ setResponseAsDefaultIfUnset('master_lb_enabled', 'master_lb_enabled');
92
89
 
93
90
  if (!template.labels) { return; }
94
91
 
@@ -97,6 +94,12 @@
97
94
  // If a template label exists as a field on the form -> Set it as a default
98
95
  setLabelResponseAsDefault('auto_scaling_enabled', 'auto_scaling_enabled', true);
99
96
  setLabelResponseAsDefault('auto_healing_enabled', 'auto_healing_enabled', true);
97
+ setLabelResponseAsDefault(
98
+ 'master_lb_floating_ip_enabled',
99
+ 'master_lb_floating_ip_enabled',
100
+ true);
101
+ // Forcibly clear allowed cidr values on template load. Otherwise this value becomes nil.
102
+ $scope.model.api_master_lb_allowed_cidrs = MODEL_DEFAULTS.api_master_lb_allowed_cidrs;
100
103
 
101
104
  // Set default `ingress_controller` based on its label
102
105
  if (template.labels.ingress_controller !== null &&
@@ -204,12 +204,14 @@
204
204
 
205
205
  it('should always override some model properties by values from ' +
206
206
  'retrieved cluster template', function() {
207
- $scope.model.floating_ip_enabled = !MODEL_DEFAULTS.floating_ip_enabled;
208
- templateResponse.floating_ip_enabled = !$scope.model.floating_ip_enabled;
209
- $scope.model.cluster_template_id = '99'; // Triggers bussines logic revalidation
207
+ $scope.model.master_lb_floating_ip_enabled = !MODEL_DEFAULTS.master_lb_floating_ip_enabled;
208
+ templateResponse.master_lb_floating_ip_enabled = !$scope.model.master_lb_floating_ip_enabled;
209
+ $scope.model.cluster_template_id = '99'; // Triggers business logic revalidation
210
210
  $scope.$apply();
211
211
 
212
- expect($scope.model.floating_ip_enabled).toBe(templateResponse.floating_ip_enabled);
212
+ expect($scope.model.master_lb_floating_ip_enabled).toBe(
213
+ templateResponse.master_lb_floating_ip_enabled
214
+ );
213
215
  });
214
216
 
215
217
  it('should always override some model\'s properties by values from ' +
@@ -220,11 +222,16 @@
220
222
  templateResponse.labels.auto_scaling_enabled = 'true';
221
223
  model.auto_healing_enabled = true;
222
224
  templateResponse.labels.auto_healing_enabled = 'false';
223
- model.cluster_template_id = '99'; // Triggers bussines logic revalidation
225
+ model.api_master_lb_allowed_cidrs = "192.168.67.0/24";
226
+ templateResponse.labels.api_master_lb_allowed_cidrs = "10.0.0.1/16";
227
+ model.cluster_template_id = '99'; // Triggers business logic revalidation
224
228
  $scope.$apply();
225
229
 
226
230
  expect(model.auto_scaling_enabled).toBe(true);
227
231
  expect(model.auto_healing_enabled).toBe(false);
232
+ expect($scope.model.api_master_lb_allowed_cidrs).toBe(
233
+ MODEL_DEFAULTS.api_master_lb_allowed_cidrs
234
+ );
228
235
  });
229
236
 
230
237
  it('should not fail if the cluster template response is empty', function() {
@@ -1,4 +1,13 @@
1
- <h1 class="h4" translate>Cluster API</h1>
1
+ <h1 class="h4" translate>Network</h1>
2
2
 
3
- <p translate>Making the Kubernetes API accessible from the private network only is the most secure option (the default), but access will be limited to compute instances on the same private network or a VPN to that network.</p>
4
- <p translate>Making the Kubernetes API accessible from anywhere on the public internet is convenient, but may represent a security risk. <em>[When selecting this option, it is recommended to limit access to a trusted IP address range.]</em></p>
3
+ <p translate>You can choose to create a new network for this cluster, or use an existing network. If you use an existing, it needs to have a subnet and router with a gateway on the external network. You may also need to take care not to conflict with CIDRs in use by the Kubernetes pod and service network.</p>
4
+
5
+
6
+ <h1 class="h4" translate>API Loadbalancer: Floating IP</h1>
7
+
8
+ <p translate>Making the Kubernetes API accessible from your private network only is the most secure option (the default), but access will be limited to compute instances on the same private network or a VPN to that network.</p>
9
+ <p translate>Making the Kubernetes API accessible from the public internet with a floating IP is convenient, but may represent a security risk. When selecting this option, it is recommended to set Allowed CIDRs to limit access to a trusted IP address range.</p>
10
+
11
+
12
+ <h1 class="h4" translate>API Loadbalancer: Allowed CIDRs</h1>
13
+ <p translate>If this field is left empty, the API Loadbalancer will accept connections from any address. When set to one or more CIDR then only those, plus the internal network, are permitted access to the Kubernetes API Loadbalancer.</em></p>
@@ -44,6 +44,9 @@
44
44
  // comma-separated key=value with optional space after comma
45
45
  var REGEXP_KEY_VALUE = /^(\w+=[^,]+,?\s?)+$/;
46
46
 
47
+ // Comma-separated CIDR list. Allows lots of variation to include v4 and v6.
48
+ var REGEXP_CIDR_LIST = /^[a-f0-9\.:]+\/[0-9]+(,\s?[a-f0-9\.:]+\/[0-9]+)*$/;
49
+
47
50
  // Object name, must start with alphabetical character.
48
51
  var REGEXP_CLUSTER_NAME = /^[a-zA-Z][a-zA-Z0-9_\-\.]*$/;
49
52
 
@@ -109,7 +112,8 @@
109
112
  'create_network': { type: 'boolean' },
110
113
  'fixed_network': { type: 'string' },
111
114
  'fixed_subnet': { type: 'string' },
112
- 'floating_ip_enabled': { type: 'boolean' },
115
+ 'master_lb_floating_ip_enabled': { type: 'boolean' },
116
+ 'api_master_lb_allowed_cidrs': { type: 'string' },
113
117
  'ingress_controller': { type: 'object' },
114
118
 
115
119
  'auto_healing_enabled': { type: 'boolean' },
@@ -359,11 +363,6 @@
359
363
  type: 'fieldset',
360
364
  title: gettext('Network'),
361
365
  items: [
362
- {
363
- key: 'master_lb_enabled',
364
- type: 'checkbox',
365
- title: gettext('Enable Load Balancer for Master Nodes')
366
- },
367
366
  {
368
367
  key: 'create_network',
369
368
  title: gettext('Create New Network'),
@@ -398,25 +397,65 @@
398
397
  },
399
398
  {
400
399
  type: 'fieldset',
401
- title: gettext('Network Access Control'),
400
+ title: gettext('Kubernetes API Loadbalancer'),
402
401
  items: [
403
402
  {
404
- key: 'floating_ip_enabled',
403
+ key: 'master_lb_enabled',
404
+ type: 'checkbox',
405
+ title: gettext('Enable Load Balancer for Kubernetes API'),
406
+ onChange: function(value) {
407
+ if (value) {
408
+ model.master_count = MODEL_DEFAULTS.master_count;
409
+ // Reset values to defaults. They are null after being disabled.
410
+ model.master_lb_floating_ip_enabled =
411
+ MODEL_DEFAULTS.master_lb_floating_ip_enabled;
412
+ model.api_master_lb_allowed_cidrs =
413
+ MODEL_DEFAULTS.api_master_lb_allowed_cidrs;
414
+ } else {
415
+ // Without master_lb_enabled, we can only support
416
+ // a single master node.
417
+ model.master_count = 1;
418
+ }
419
+ model.isSingleMasterNode = !value;
420
+ }
421
+ },
422
+ {
423
+ key: 'master_lb_floating_ip_enabled', // formerly floating_ip_enabled
405
424
  type: 'select',
406
- title: gettext('Cluster API'),
425
+ title: gettext('Floating IP'),
407
426
  titleMap: [
408
427
  {value: false, name: gettext('Accessible on private network only')},
409
- {value: true, name: gettext('Accessible on the public internet')}
410
- ]
428
+ {value: true, name: gettext('Accessible with public floating IP')}
429
+ ],
430
+ condition: 'model.master_lb_enabled === true'
431
+ },
432
+ {
433
+ key: 'api_master_lb_allowed_cidrs',
434
+ type: 'text',
435
+ title: gettext('Allowed CIDRs'),
436
+ validationMessage: {
437
+ invalidFormat: gettext('Invalid format. Must be a comma-separated ' +
438
+ 'CIDR string: 192.168.1.5/32,10.0.0.1/24')
439
+ },
440
+ $validators: {
441
+ invalidFormat: function(cidrString) {
442
+ return cidrString === '' || REGEXP_CIDR_LIST.test(cidrString);
443
+ }
444
+ },
445
+ condition: 'model.master_lb_enabled === true',
411
446
  },
412
- // Warning message for the Cluster API
447
+ // Warning message when Kubernetes API has a Floating IP
413
448
  {
414
449
  type: 'template',
415
450
  template: '<div class="alert alert-warning">' +
416
451
  '<span class="fa fa-warning"></span> ' +
417
- gettext('It is generally not recommended to give public access.') +
452
+ gettext('A public floating IP will mean the Kubernetes API is ' +
453
+ 'publically routable on the internet. It is generally not ' +
454
+ 'recommended to give public access to the Kubernetes API. ' +
455
+ 'Consider limiting the access using the Allowed CIDRs ' +
456
+ 'section.') +
418
457
  '</div>',
419
- condition: 'model.floating_ip_enabled == true'
458
+ condition: 'model.master_lb_floating_ip_enabled == true'
420
459
  }
421
460
  ]
422
461
  },
@@ -538,7 +577,8 @@
538
577
  create_network: true,
539
578
  fixed_network: '',
540
579
  fixed_subnet: '',
541
- floating_ip_enabled: false,
580
+ master_lb_floating_ip_enabled: false,
581
+ api_master_lb_allowed_cidrs: '',
542
582
  ingress_controller: '',
543
583
 
544
584
  auto_healing_enabled: true,
@@ -646,7 +686,7 @@
646
686
  fixedSubnets = [{value: "", name: fixedSubnetsInitial}];
647
687
  }
648
688
  // NOTE(dalees): This hardcoded index could be improved by referencing an object instead.
649
- form[0].tabs[2].items[0].items[0].items[3].titleMap = subnetTitleMap;
689
+ form[0].tabs[2].items[0].items[0].items[2].titleMap = subnetTitleMap;
650
690
  model.fixed_subnet = MODEL_DEFAULTS.fixed_subnet;
651
691
  }
652
692
 
@@ -4,6 +4,7 @@ Andreas Jaeger <aj@suse.com>
4
4
  Andreas Jaeger <aj@suse.de>
5
5
  Andrei Nistor <andrei_nistor@smart-x.net>
6
6
  Andrew Bogott <abogott@wikimedia.org>
7
+ Andrew Bonney <andrew.bonney@bbc.co.uk>
7
8
  Bharat Kunwar <bharat@stackhpc.com>
8
9
  Bharat Kunwar <brtknr@bath.edu>
9
10
  Bradley Jones <jones.bradley@me.com>
@@ -1,12 +1,10 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: magnum-ui
3
- Version: 15.0.0.0rc1
3
+ Version: 16.0.0.0rc1
4
4
  Summary: Magnum User Interface
5
5
  Home-page: https://docs.openstack.org/developer/magnum-ui/
6
6
  Author: OpenStack
7
7
  Author-email: openstack-discuss@lists.openstack.org
8
- License: UNKNOWN
9
- Platform: UNKNOWN
10
8
  Classifier: Environment :: OpenStack
11
9
  Classifier: Intended Audience :: Information Technology
12
10
  Classifier: Intended Audience :: System Administrators
@@ -20,10 +18,12 @@ Classifier: Programming Language :: Python :: 3.8
20
18
  Classifier: Programming Language :: Python :: 3.9
21
19
  Classifier: Programming Language :: Python :: 3.10
22
20
  Classifier: Programming Language :: Python :: 3.11
23
- Requires-Dist: horizon (>=17.1.0)
24
- Requires-Dist: pbr (!=2.1.0,>=2.0.0)
25
- Requires-Dist: python-heatclient (>=1.18.0)
26
- Requires-Dist: python-magnumclient (>=4.2.0)
21
+ License-File: LICENSE
22
+ License-File: AUTHORS
23
+ Requires-Dist: pbr !=2.1.0,>=2.0.0
24
+ Requires-Dist: python-magnumclient >=4.2.0
25
+ Requires-Dist: python-heatclient >=1.18.0
26
+ Requires-Dist: horizon >=17.1.0
27
27
 
28
28
  ========================
29
29
  Team and repository tags
@@ -97,5 +97,3 @@ To run horizon with the newly enabled Magnum UI plugin run::
97
97
  to have the application start on port 8080 and the horizon dashboard will be
98
98
  available in your browser at http://localhost:8080/
99
99
 
100
-
101
-
@@ -3,9 +3,9 @@ magnum_ui/karma.conf.js,sha256=hcG4XL66J9t4NCYRy4S-N6Fyz5ZIIQJeHvkcRJ-949A,5502
3
3
  magnum_ui/version.py,sha256=wE4hFR9_kWK53KfUZNviqJMpLy_3a2jQBcrNhJHLeHw,626
4
4
  magnum_ui/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  magnum_ui/api/heat.py,sha256=lM3URoQ4PWahTFAbfNqHP6vppUkr4mfqOikanBUUgfg,1910
6
- magnum_ui/api/magnum.py,sha256=suVNV8gOF7N3zUB_wO4SJCfuzz8L9Yr20ZyeMmmE13U,10137
6
+ magnum_ui/api/magnum.py,sha256=g13jvbI3pzUf9HEMiGSPK91YqBK7Th6XU8IqUDOP3bA,10348
7
7
  magnum_ui/api/rest/__init__.py,sha256=YNQkFUbPTeSOVF8Fs1OeCkAfsoIBBNZfePBNe93EJg8,639
8
- magnum_ui/api/rest/magnum.py,sha256=NGX1yw3G8w6vQxSAf2SP6RugpNxlAr6MSMS9OusPhV4,15704
8
+ magnum_ui/api/rest/magnum.py,sha256=LAzKTPfSjpHVPiZa_M8EV8HJW6vaAXvyLnQluVg5iBE,16105
9
9
  magnum_ui/content/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
10
  magnum_ui/content/cluster_templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
11
  magnum_ui/content/cluster_templates/panel.py,sha256=yU0HwXKvIQ4oThM9yB2kldJ4mdV2NlENHWjs4WHVn20,789
@@ -93,7 +93,7 @@ magnum_ui/static/dashboard/container-infra/clusters/clusters.utils.spec.js,sha25
93
93
  magnum_ui/static/dashboard/container-infra/clusters/panel.html,sha256=SoSjm69fTYK0OKxAP9Sd8kGY9Qn0vGwQ_Ljc55ADvUo,1005
94
94
  magnum_ui/static/dashboard/container-infra/clusters/config/config.service.js,sha256=R0QaoUl6GM1GfZjT9Bcu5WgNRqVOs5zAMhIp2TaGia4,2358
95
95
  magnum_ui/static/dashboard/container-infra/clusters/config/config.service.spec.js,sha256=Ej_ztZATzc8Ui__DHMzZrd0XwpPlAfjR2SzjMugM_B4,2827
96
- magnum_ui/static/dashboard/container-infra/clusters/create/create.service.js,sha256=fEjaHZNOUwtXMGote1qkA3WIzbsBCD1Ra-IiXHOB9FM,6590
96
+ magnum_ui/static/dashboard/container-infra/clusters/create/create.service.js,sha256=o1OhoiPE60gFMj71Y85Ug2UWG5inXPgwqWNKSdzcXZs,6772
97
97
  magnum_ui/static/dashboard/container-infra/clusters/create/create.service.spec.js,sha256=Ai0GTzTDPSraJQ5J8kOkKrrHd2F4z3MrU9rgrfPBl2c,4282
98
98
  magnum_ui/static/dashboard/container-infra/clusters/delete/delete.service.js,sha256=t2Cigzjaq7LIENDQbqWOs8I0RzQpJ8cNP4gvMoVvyi4,5824
99
99
  magnum_ui/static/dashboard/container-infra/clusters/delete/delete.service.spec.js,sha256=jS5eILGS8toKIu1tcbKo-sS7cyS4P1PdbHTS8GaTb9g,4213
@@ -104,8 +104,8 @@ magnum_ui/static/dashboard/container-infra/clusters/details/drawer.html,sha256=0
104
104
  magnum_ui/static/dashboard/container-infra/clusters/details/overview.controller.js,sha256=22cJ4cjnVT_jzJ4CCXQ36-krpY1-ADTd08-alm4KdsI,1533
105
105
  magnum_ui/static/dashboard/container-infra/clusters/details/overview.controller.spec.js,sha256=fmuWauBD6bZM8hDN32xtauamqLW9IVB4ZhPE8rpR0W0,1719
106
106
  magnum_ui/static/dashboard/container-infra/clusters/details/overview.html,sha256=tw-ga-rQMN5xQandng7mWmzJ9xbLzTf0242lUgvBbjY,4514
107
- magnum_ui/static/dashboard/container-infra/clusters/resize/resize.service.js,sha256=gUV9vCPsixHB8WuNqhGrVJS626Czt0HJtEgQdycK_9Q,6234
108
- magnum_ui/static/dashboard/container-infra/clusters/resize/resize.service.spec.js,sha256=AfvHDDXOwVyDgczTn9TTQT52X_BpJy4aelPIPX7Xg24,4021
107
+ magnum_ui/static/dashboard/container-infra/clusters/resize/resize.service.js,sha256=qUGFTFxINEOrSDRpIS0Xm3FiO_0-TqlNt7_qTtA7SIk,6527
108
+ magnum_ui/static/dashboard/container-infra/clusters/resize/resize.service.spec.js,sha256=4W7JDfYKRBYq-F0bJZlu9KDH1ow8gRwS6EDMHVFBmeg,4693
109
109
  magnum_ui/static/dashboard/container-infra/clusters/rolling-upgrade/upgrade.service.js,sha256=jvbsYRUGI1FktfETc1sIOssWr_pw1rlrcRCozmCoFck,7506
110
110
  magnum_ui/static/dashboard/container-infra/clusters/rolling-upgrade/upgrade.service.spec.js,sha256=w4OoURdD_IF_jM-fS6ZjlmgOIIGGeF1pVActS6jgKSc,4801
111
111
  magnum_ui/static/dashboard/container-infra/clusters/rotate-certificate/rotate-certificate.service.js,sha256=d-ZaxAFyoBPtDxHOn5svEG_Ac9ygi7sOn7oGv2A-q_U,2382
@@ -119,14 +119,14 @@ magnum_ui/static/dashboard/container-infra/clusters/sign-certificate/sign-certif
119
119
  magnum_ui/static/dashboard/container-infra/clusters/sign-certificate/sign-certificate.service.js,sha256=jgt-EhcFz4YqFn-6gqz3adSNb4WVjxY8oqeGTyaQ2c0,2979
120
120
  magnum_ui/static/dashboard/container-infra/clusters/sign-certificate/sign-certificate.service.spec.js,sha256=wBTnUhcAGMX5CnEAsvfi7N2PDNai_kQ3zh4StYTD3HQ,2393
121
121
  magnum_ui/static/dashboard/container-infra/clusters/workflow/advanced.help.html,sha256=3TpipMb754br3cYVIQyT_smPtbMngEfudJ2nHgapbT4,393
122
- magnum_ui/static/dashboard/container-infra/clusters/workflow/cluster-template.controller.js,sha256=b_9dT7DNmVxdpLfEFUSFFFDy2CKVsyZlOXG1vVTC0pU,4764
123
- magnum_ui/static/dashboard/container-infra/clusters/workflow/cluster-template.controller.spec.js,sha256=FmSdq-p-L_GbgQQUMxblcxPXEIkRJE5LiM_lelJ2vBs,9484
122
+ magnum_ui/static/dashboard/container-infra/clusters/workflow/cluster-template.controller.js,sha256=TENUOncg63ukNeGxLUfPtKsDC3wYcopGZHPoXGoPIlQ,5027
123
+ magnum_ui/static/dashboard/container-infra/clusters/workflow/cluster-template.controller.spec.js,sha256=TupdSwiIUhMRtdapD9SW9M5uWDwAsrPbcULTc5jgKug,9817
124
124
  magnum_ui/static/dashboard/container-infra/clusters/workflow/cluster-template.html,sha256=MMxTztsVLyw7O3ZvStQ7wyvFetVpmCpZ658ctiu3WDk,1315
125
125
  magnum_ui/static/dashboard/container-infra/clusters/workflow/details.help.html,sha256=UTG87Dp-4jYABEKdHqeAKNB4C8fqpgriP9MJ_itEk_0,229
126
126
  magnum_ui/static/dashboard/container-infra/clusters/workflow/management.help.html,sha256=cowhxDWnXXefPGRAbUTbXHZboXEmuLgk0CfMikDjIvQ,266
127
- magnum_ui/static/dashboard/container-infra/clusters/workflow/network.help.html,sha256=8VpsnBRp7wHupxgW_uizMpO0sCyW6R0CRMbzLhKRCt4,514
127
+ magnum_ui/static/dashboard/container-infra/clusters/workflow/network.help.html,sha256=36Fe01YOn836Qz_GnpBC6A60EDSknLBcKnPtJM75oNA,1211
128
128
  magnum_ui/static/dashboard/container-infra/clusters/workflow/size.help.html,sha256=C4uRym8byNSBX6ROfCEFm0caxAeA7cusXcuRbzWl7Qo,861
129
- magnum_ui/static/dashboard/container-infra/clusters/workflow/workflow.service.js,sha256=mY9IWoOBWOjjOsm1WReiaTon4jug0rsUxbJsC2eK60g,27382
129
+ magnum_ui/static/dashboard/container-infra/clusters/workflow/workflow.service.js,sha256=wDwsWs1Azk5UyqXzUAR4mAThqAYCLCNxrn9CP49WcEU,29828
130
130
  magnum_ui/static/dashboard/container-infra/clusters/workflow/workflow.service.spec.js,sha256=iV9ZnzQZ8Qbtavh2dRudb3yxu6t9d2fD28U9Ajw-sxU,3861
131
131
  magnum_ui/static/dashboard/container-infra/quotas/actions.module.js,sha256=ijIKewMFFxNf8qBy1GtUcrAgr_5bkSp99GcYP_Axa8M,2434
132
132
  magnum_ui/static/dashboard/container-infra/quotas/actions.module.spec.js,sha256=T8P5gcUFUwy2Gvd_HtDxJQ2f4v0CuGbc6pLU1zonB-g,1299
@@ -150,10 +150,10 @@ magnum_ui/test/test_data.py,sha256=FjDNKKnxx3nDTczb7kMQYbMlg5yhin06F080Gt9AkD0,3
150
150
  magnum_ui/test/api_tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
151
151
  magnum_ui/test/api_tests/test_rest_api.py,sha256=A8VanDLVVnTdJeXstZs0CaokoE27uGbpt2k_x30TFqI,5516
152
152
  magnum_ui/test/integration_tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
153
- magnum_ui-15.0.0.0rc1.dist-info/AUTHORS,sha256=9wZ79Ri_1qLko7A_kSQHemM1qGD8cdePgSoj4NUZpKc,2799
154
- magnum_ui-15.0.0.0rc1.dist-info/LICENSE,sha256=XfKg2H1sVi8OoRxoisUlMqoo10TKvHmU_wU39ks7MyA,10143
155
- magnum_ui-15.0.0.0rc1.dist-info/METADATA,sha256=Bmon6wFYLUxEOvCOZgsj11FQClPJfdyDXjVHgfsroT0,3500
156
- magnum_ui-15.0.0.0rc1.dist-info/WHEEL,sha256=g4nMs7d-Xl9-xC9XovUrsDHGXt-FT0E17Yqo92DEfvY,92
157
- magnum_ui-15.0.0.0rc1.dist-info/pbr.json,sha256=rb_pXYWAFYv9XWiTc1ekCwDfoPUOdh8Nl9ZFqWPkluo,46
158
- magnum_ui-15.0.0.0rc1.dist-info/top_level.txt,sha256=CDLukePJoQ3_SL4beNNspl5mYErPcdlNGI9CEKD01cA,10
159
- magnum_ui-15.0.0.0rc1.dist-info/RECORD,,
153
+ magnum_ui-16.0.0.0rc1.dist-info/AUTHORS,sha256=0cQzwdJJrjN8oW8CLf0XHhJB6ab-vZJXy_h5w_LQjdc,2839
154
+ magnum_ui-16.0.0.0rc1.dist-info/LICENSE,sha256=XfKg2H1sVi8OoRxoisUlMqoo10TKvHmU_wU39ks7MyA,10143
155
+ magnum_ui-16.0.0.0rc1.dist-info/METADATA,sha256=L8DSgEz4BBPvPnbvxBGliUrfIB09oEDGUv_7Ypt7GTE,3499
156
+ magnum_ui-16.0.0.0rc1.dist-info/WHEEL,sha256=iAkIy5fosb7FzIOwONchHf19Qu7_1wCWyFNR5gu9nU0,91
157
+ magnum_ui-16.0.0.0rc1.dist-info/pbr.json,sha256=2ZBmaB2J3r5fbK6P1l1YmioDvea34K_1Zf9kYDu4Yho,46
158
+ magnum_ui-16.0.0.0rc1.dist-info/top_level.txt,sha256=CDLukePJoQ3_SL4beNNspl5mYErPcdlNGI9CEKD01cA,10
159
+ magnum_ui-16.0.0.0rc1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.34.2)
2
+ Generator: setuptools (75.3.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -0,0 +1 @@
1
+ {"git_version": "829919f", "is_release": true}
@@ -1 +0,0 @@
1
- {"git_version": "736edba", "is_release": true}