def test_required_label_not_shown(self): """Widget showing a non-required charm should NOT have a label showing how many units are required. """ w = ServiceWidget(CharmJujuGui, self.pc) self.assertFalse(search_in_widget(".* of .* placed", w))
def test_dont_show_placements(self): """Widget with show_placements set to FALSE should NOT show placements""" self.pc.assign(self.mock_machine, CharmNovaCompute, AssignmentType.LXC) w = ServiceWidget(CharmNovaCompute, self.pc, show_placements=False) self.assertFalse(search_in_widget("LXC.*machine1-hostname", w))
def test_show_constraints(self): """Widget with show_constraints set should show constraints""" self.pc.assign(self.mock_machine, CharmNovaCompute, AssignmentType.LXC) w = ServiceWidget(CharmNovaCompute, self.pc, show_constraints=True) conpat = ("constraints.*" + ".*".join(CharmNovaCompute.constraints.keys())) self.assertTrue(search_in_widget(conpat, w))
def build_widgets(self): if self.charm_class.allow_multi_units: machine_string = "machines" plural_string = "s" else: machine_string = "a machine" plural_string = "" instructions = Text("Select {} to host {}".format( machine_string, self.charm_class.display_name)) self.service_widget = ServiceWidget(self.charm_class, self.controller, show_constraints=True, show_placements=True) all_actions = [(AssignmentType.BareMetal, 'Add as Bare Metal', self.do_select_baremetal), (AssignmentType.LXC, 'Add as LXC', self.do_select_lxc), (AssignmentType.KVM, 'Add as KVM', self.do_select_kvm)] actions = [(label, func) for atype, label, func in all_actions if atype in self.charm_class.allowed_assignment_types] constraints = self.charm_class.constraints # NOTE: show_assignments=False is a WORKAROUND for #194 self.machines_list = MachinesList(self.controller, actions, constraints=constraints, show_hardware=True, show_assignments=False) self.machines_list.update() close_button = AttrMap(Button('X', on_press=self.close_pressed), 'button_secondary', 'button_secondary focus') p = Pile([ GridFlow([close_button], 5, 1, 0, 'right'), instructions, Divider(), self.service_widget, Divider(), self.machines_list ]) return LineBox(p, title="Select Machine{}".format(plural_string))
def test_actions_use_pred(self): """Action predicates control whether a button appears (disabled)""" # NOTE: this test assumes that disabled buttons are just the # button label with parentheses. fake_action_func = MagicMock() fake_pred = MagicMock() fake_pred.return_value = False actions = [(fake_pred, "fake-action", fake_action_func)] w = ServiceWidget(CharmNovaCompute, self.pc, actions=actions) self.assertTrue(search_in_widget("\(.*fake-action.*\)", w)) fake_pred.assert_called_with(CharmNovaCompute) fake_pred.return_value = True fake_pred.reset_mock() w.update() self.assertTrue(search_in_widget("<.*fake-action.*>", w)) fake_pred.assert_called_with(CharmNovaCompute)
def add_service_widget(self, charm_class): if charm_class.subordinate: actions = self.subordinate_actions else: actions = self.actions sw = ServiceWidget(charm_class, self.controller, actions, self.show_constraints, show_placements=self.show_placements) self.service_widgets.append(sw) options = self.service_pile.options() self.service_pile.contents.append((sw, options)) self.service_pile.contents.append( (AttrMap(Padding(Divider('\u23bc'), left=2, right=2), 'label'), options)) return sw
def build_widgets(self): if self.charm_class.allow_multi_units: machine_string = "machines" plural_string = "s" else: machine_string = "a machine" plural_string = "" instructions = Text("Select {} to host {}".format( machine_string, self.charm_class.display_name)) self.service_widget = ServiceWidget(self.charm_class, self.controller, show_constraints=True, show_placements=True) all_actions = [(AssignmentType.BareMetal, 'Add as Bare Metal', self.do_select_baremetal), (AssignmentType.LXC, 'Add as LXC', self.do_select_lxc), (AssignmentType.KVM, 'Add as KVM', self.do_select_kvm)] actions = [(label, func) for atype, label, func in all_actions if atype in self.charm_class.allowed_assignment_types] constraints = self.charm_class.constraints # NOTE: show_assignments=False is a WORKAROUND for #194 self.machines_list = MachinesList(self.controller, actions, constraints=constraints, show_hardware=True, show_assignments=False) self.machines_list.update() close_button = AttrMap(Button('X', on_press=self.close_pressed), 'button_secondary', 'button_secondary focus') p = Pile([GridFlow([close_button], 5, 1, 0, 'right'), instructions, Divider(), self.service_widget, Divider(), self.machines_list]) return LineBox(p, title="Select Machine{}".format(plural_string))
def test_required_label_shown(self): """Widget showing a required charm should have a label showing how many units are required""" w = ServiceWidget(CharmKeystone, self.pc) self.assertTrue(search_in_widget("0 of 1 placed", w))
def test_show_actions(self): """Actions should be shown as buttons""" fake_action_func = MagicMock() actions = [("fake-action", fake_action_func)] w = ServiceWidget(CharmNovaCompute, self.pc, actions=actions) self.assertTrue(search_in_widget("fake-action", w))
class MachineChooser(WidgetWrap): """Presents list of machines to assign a service to. Supports multiple selection if the service does. """ def __init__(self, controller, charm_class, parent_widget): self.controller = controller self.charm_class = charm_class self.parent_widget = parent_widget w = self.build_widgets() super().__init__(w) def build_widgets(self): if self.charm_class.allow_multi_units: machine_string = "machines" plural_string = "s" else: machine_string = "a machine" plural_string = "" instructions = Text("Select {} to host {}".format( machine_string, self.charm_class.display_name)) self.service_widget = ServiceWidget(self.charm_class, self.controller, show_constraints=True, show_placements=True) all_actions = [(AssignmentType.BareMetal, 'Add as Bare Metal', self.do_select_baremetal), (AssignmentType.LXC, 'Add as LXC', self.do_select_lxc), (AssignmentType.KVM, 'Add as KVM', self.do_select_kvm)] actions = [(label, func) for atype, label, func in all_actions if atype in self.charm_class.allowed_assignment_types] constraints = self.charm_class.constraints # NOTE: show_assignments=False is a WORKAROUND for #194 self.machines_list = MachinesList(self.controller, actions, constraints=constraints, show_hardware=True, show_assignments=False) self.machines_list.update() close_button = AttrMap(Button('X', on_press=self.close_pressed), 'button_secondary', 'button_secondary focus') p = Pile([GridFlow([close_button], 5, 1, 0, 'right'), instructions, Divider(), self.service_widget, Divider(), self.machines_list]) return LineBox(p, title="Select Machine{}".format(plural_string)) def do_select_baremetal(self, sender, machine): self.do_select(sender, machine, AssignmentType.BareMetal) def do_select_lxc(self, sender, machine): self.do_select(sender, machine, AssignmentType.LXC) def do_select_kvm(self, sender, machine): self.do_select(sender, machine, AssignmentType.KVM) def do_select(self, sender, machine, atype): self.controller.assign(machine, self.charm_class, atype) self.machines_list.update() self.service_widget.update() self.parent_widget.remove_overlay(self) def close_pressed(self, sender): self.parent_widget.remove_overlay(self)
class MachineChooser(WidgetWrap): """Presents list of machines to assign a service to. Supports multiple selection if the service does. """ def __init__(self, controller, charm_class, parent_widget): self.controller = controller self.charm_class = charm_class self.parent_widget = parent_widget w = self.build_widgets() super().__init__(w) def build_widgets(self): if self.charm_class.allow_multi_units: machine_string = "machines" plural_string = "s" else: machine_string = "a machine" plural_string = "" instructions = Text("Select {} to host {}".format( machine_string, self.charm_class.display_name)) self.service_widget = ServiceWidget(self.charm_class, self.controller, show_constraints=True, show_placements=True) all_actions = [(AssignmentType.BareMetal, 'Add as Bare Metal', self.do_select_baremetal), (AssignmentType.LXC, 'Add as LXC', self.do_select_lxc), (AssignmentType.KVM, 'Add as KVM', self.do_select_kvm)] actions = [(label, func) for atype, label, func in all_actions if atype in self.charm_class.allowed_assignment_types] constraints = self.charm_class.constraints # NOTE: show_assignments=False is a WORKAROUND for #194 self.machines_list = MachinesList(self.controller, actions, constraints=constraints, show_hardware=True, show_assignments=False) self.machines_list.update() close_button = AttrMap(Button('X', on_press=self.close_pressed), 'button_secondary', 'button_secondary focus') p = Pile([ GridFlow([close_button], 5, 1, 0, 'right'), instructions, Divider(), self.service_widget, Divider(), self.machines_list ]) return LineBox(p, title="Select Machine{}".format(plural_string)) def do_select_baremetal(self, sender, machine): self.do_select(sender, machine, AssignmentType.BareMetal) def do_select_lxc(self, sender, machine): self.do_select(sender, machine, AssignmentType.LXC) def do_select_kvm(self, sender, machine): self.do_select(sender, machine, AssignmentType.KVM) def do_select(self, sender, machine, atype): self.controller.assign(machine, self.charm_class, atype) self.machines_list.update() self.service_widget.update() self.parent_widget.remove_overlay(self) def close_pressed(self, sender): self.parent_widget.remove_overlay(self)