def test_widgets_fresh_undercloud(self): # Test widgets = self.section.widgets() # Verify self.assertWidgetListEqual(widgets, [ # Title util.header("Overview - Not Yet Deployed"), urwid.Divider(), urwid.Divider(), # Glance util.header("Glance Images"), urwid.Text("0 images uploaded."), urwid.Text("Use these commands to build and upload images:"), urwid.Text(" openstack overcloud image build --all"), urwid.Text(" openstack overcloud image upload"), urwid.Divider(), # Ironic util.header("Ironic Nodes"), urwid.Text("0 nodes registered."), urwid.Text("Use these commands to register nodes:"), urwid.Text(" openstack baremetal import --json instackenv.json" ), urwid.Text(" openstack baremetal configure boot"), urwid.Divider(), # Heat util.header("Heat Stack"), urwid.Text("No stacks deployed.", ), urwid.Divider(), ])
def test_widgets(self): self.clients.inspector.get_status.return_value = {'finished': True, } self.clients.ironic.node.list.return_value = [ mock.MagicMock( uuid="NODE UUID", instance_uuid="INSTANCE UUID", power_state="Off", provision_state="active", maintenance=False) ] widgets = self.section.widgets() widths = [11, 15, 7, 11, 13, 15] self.assertWidgetListEqual(widgets, [ util.header("Nodes"), urwid.Divider(), urwid.Divider(), util.TableRow(self.section.table_headers, widths, util.table_header), urwid.Divider(), util.TableRow( ('NODE UUID', 'INSTANCE UUID', 'Off', 'active', False, True), widths, util.table_header, ), ])
def test_widgets(self): self.clients.heat.stacks.list.return_value = [ mock.MagicMock( stack_name="overcloud", stack_status="CREATE_COMPLETE", creation_time="2016-02-29T11:02:58Z", updated_time="2016-02-29T11:02:58Z") ] widgets = self.section.widgets() widths = [11, 17, 22, 22] self.assertWidgetListEqual(widgets, [ util.header("Stacks"), urwid.Divider(), urwid.Divider(), util.TableRow(self.section.table_headers, widths, util.table_header), urwid.Divider(), util.TableRow( ('overcloud', 'CREATE_COMPLETE', '2016-02-29T11:02:58Z', '2016-02-29T11:02:58Z'), widths, util.table_header, ), ])
def test_widgets(self): server = mock.MagicMock( human_id="overcloud-objectstorage-0", networks={'ctlplane': ['192.0.2.13']} ) server.id = "ID ID ID" self.clients.nova.servers.list.return_value = [server, ] widgets = self.section.widgets() widths = [10, 27, 30] self.assertWidgetListEqual(widgets, [ util.header("Servers"), urwid.Divider(), urwid.Divider(), util.TableRow(self.section.table_headers, widths, util.table_header), urwid.Divider(), util.TableRow( ('ID ID ID', 'overcloud-objectstorage-0', "{'ctlplane': ['192.0.2.13']}"), widths, util.table_header, ), ])
def test_image_summary_all(self): def create_image(name): i = mock.MagicMock() i.name = name return i # Setup self.section.clients.glance.images.list.return_value = [ create_image(name="image1"), create_image(name="image2"), ] # Test widgets = self.section._images_summary() # Verify self.assertWidgetListEqual(widgets, [ util.header("Glance Images"), urwid.Text("2 images uploaded."), urwid.Text("- image1"), urwid.Text("- image2"), urwid.Divider(), ])
def test_widgets(self): image = mock.MagicMock(size=5153184, status="active", created_at="2016-02-29T11:02:58Z", updated_at="2016-02-29T11:02:58Z") image.id = "ID ID ID ID" image.name = "Image Name" self.clients.glance.images.list.return_value = [image, ] widgets = self.section.widgets() widths = [13, 12, 9, 8, 22, 22] self.assertWidgetListEqual(widgets, [ util.header("Images"), urwid.Divider(), urwid.Divider(), util.TableRow(self.section.table_headers, widths, util.table_header), urwid.Divider(), util.TableRow(( image.id, image.name, image.size, image.status, image.created_at, image.updated_at), widths, util.table_header ), ])
def _ironic_summary(self): nodes = list(self.clients.ironic.node.list()) by_provision_state = collections.defaultdict(list) for node in nodes: by_provision_state[node.provision_state].append(node) lines = [ util.header("Ironic Nodes"), urwid.Text("{0} nodes registered.".format(len(nodes))), ] if len(by_provision_state): for state, nodes in by_provision_state.items(): lines.append( urwid.Text("{0} nodes with the provisioning state '{1}'" .format(len(nodes), state)) ) else: lines.extend([ urwid.Text("Use these commands to register nodes:"), urwid.Text(" openstack baremetal import --json " "instackenv.json"), urwid.Text(" openstack baremetal configure boot"), ]) lines.append(urwid.Divider()) return lines
def test_header(self): # Test txt = util.header("Header") # Verify self.assertEqual(txt.get_text(), ('Header', [('header', 6)]))
def test_widgets_no_nodes(self): self.clients.ironic.node.list.return_value = [] widgets = self.section.widgets() self.assertWidgetListEqual(widgets, [ util.header("Nodes"), urwid.Divider(), urwid.Divider(), urwid.Text("No Ironic nodes found.") ])
def test_widgets_no_stacks(self): self.clients.nova.servers.list.return_value = [] widgets = self.section.widgets() self.assertWidgetListEqual(widgets, [ util.header("Servers"), urwid.Divider(), urwid.Divider(), urwid.Text("No Nova servers found.") ])
def test_widgets_no_images(self): self.clients.glance.images.list.return_value = [] widgets = self.section.widgets() self.assertWidgetListEqual(widgets, [ util.header("Images"), urwid.Divider(), urwid.Divider(), urwid.Text("No Glance images found.") ])
def undeployed(self): self.title += "- Not Yet Deployed" lines = [] lines.extend(self._images_summary()) lines.extend(self._ironic_summary()) lines.extend(self._inspector_summary()) lines.extend([ util.header("Heat Stack"), urwid.Text("No stacks deployed.", ), urwid.Divider(), ]) return lines
def _resource_error(self, stack): resources = self.clients.heat.resources.list(stack.stack_name, nested_depth=2) failed = (resource for resource in resources if resource.resource_status in FAILED_STATUSES) for resource in failed: yield util.header("Failed resource: {0}" .format(resource.resource_name)) yield urwid.Text("Status reason: {0}" .format(resource.resource_status_reason)) yield urwid.Divider()
def test_image_summary_emtpy(self): # Test widgets = self.section._images_summary() # Verify self.assertWidgetListEqual(widgets, [ util.header("Glance Images"), urwid.Text("0 images uploaded."), urwid.Text("Use these commands to build and upload images:"), urwid.Text(" openstack overcloud image build --all"), urwid.Text(" openstack overcloud image upload"), urwid.Divider(), ])
def test_ironic_summary_emtpy(self): # Test widgets = self.section._ironic_summary() # Verify self.assertWidgetListEqual(widgets, [ util.header("Ironic Nodes"), urwid.Text("0 nodes registered."), urwid.Text("Use these commands to register nodes:"), urwid.Text(" openstack baremetal import --json " "instackenv.json"), urwid.Text(" openstack baremetal configure boot"), urwid.Divider(), ])
def _inspector_summary(self): nodes = list(self.clients.ironic.node.list()) by_introspection_status = collections.defaultdict(list) for node in nodes: try: inspector_status = self.clients.inspector.get_status(node.uuid) inspector_status = inspector_status['finished'] except inspector_http.ClientError: inspector_status = "Not started" except clients.ServiceNotAvailable: inspector_status = 'Unknown' by_introspection_status[inspector_status].append(node) lines = [ util.header("Node Introspection") ] if len(by_introspection_status[False]): lines.append( urwid.Text("{0} nodes currently being introspected".format( len(by_introspection_status[False]))) ) if len(by_introspection_status[True]): lines.append( urwid.Text("{0} nodes finished introspection".format( len(by_introspection_status[True]))) ) if len(by_introspection_status["Not started"]): lines.append( urwid.Text("{0} nodes not yet started introspection".format( len(by_introspection_status["Not started"]))) ) if len(by_introspection_status["Unknown"]): lines.append( urwid.Text("Failed to get introspection status for {0} nodes" .format(len(by_introspection_status["Unknown"]))) ) if len(lines) == 1: return [] lines.append(urwid.Divider()) return lines
def failed(self, stacks): self.title += "- Deploy Failed" lines = [] lines.extend(self._ironic_summary()) for stack in stacks: header = "Stack '{0}' status: {1}".format( stack.stack_name, stack.stack_status) lines.append(util.header(header)) lines.extend(self._resource_error(stack)) lines.append(urwid.Divider()) return lines
def test_ironic_summary_all(self): # Setup self.section.clients.ironic.node.list.return_value = [ mock.MagicMock(provision_state='available'), mock.MagicMock(provision_state='available'), ] # Test widgets = self.section._ironic_summary() # Verify self.assertWidgetListEqual(widgets, [ util.header("Ironic Nodes"), urwid.Text("2 nodes registered."), urwid.Text("2 nodes with the provisioning state 'available'"), urwid.Divider(), ])
def test_inspector_summary_progress(self): # Setup self.section.clients.ironic.node.list.return_value = [ mock.MagicMock(uuid='UUID1'), mock.MagicMock(uuid='UUID2'), ] self.section.clients.inspector.get_status.return_value = { 'finished': True } # Test widgets = self.section._inspector_summary() # Verify self.assertWidgetListEqual(widgets, [ util.header("Node Introspection"), urwid.Text("2 nodes finished introspection"), urwid.Divider(), ])
def _images_summary(self): images = list(self.clients.glance.images.list()) widgets = [ util.header("Glance Images"), urwid.Text("{0} images uploaded.".format(len(images))), ] if len(images): for image in images: widgets.append(urwid.Text("- {0}".format(image.name))) else: widgets.extend([ urwid.Text("Use these commands to build and upload images:"), urwid.Text(" openstack overcloud image build --all"), urwid.Text(" openstack overcloud image upload"), ]) widgets.append(urwid.Divider()) return widgets
def deploying(self, stacks): self.title += "- Deploy In Progress" lines = [] lines.extend(self._ironic_summary()) for stack in stacks: extra = "" if stack.stack_status in DEPLOYING_STATUSES: time_string = stack.updated_time or stack.creation_time extra = " (Started: {})".format(time_string) header = "Stack '{0}' status: {1}{2}".format( stack.stack_name, stack.stack_status, extra) lines.append(util.header(header)) lines.extend(self._stack_event_summary(stack)) lines.append(urwid.Divider()) return lines
def widgets(self): return [util.header(self.title, "center"), urwid.Divider(), urwid.Divider()]