Merge lp:~ltrager/maas/lp1685361_2.1 into lp:~maas-committers/maas/trunk
- lp1685361_2.1
- Merge into trunk
Proposed by
Lee Trager
Status: | Superseded | ||||
---|---|---|---|---|---|
Proposed branch: | lp:~ltrager/maas/lp1685361_2.1 | ||||
Merge into: | lp:~maas-committers/maas/trunk | ||||
Diff against target: |
6714 lines (+5186/-44) (has conflicts) 108 files modified
MANIFEST.in (+11/-0) docs/changelog.rst (+199/-0) docs/troubleshooting.rst.OTHER (+200/-0) docs/version.rst (+15/-0) src/maasserver/api/machines.py (+24/-0) src/maasserver/api/spaces.py (+7/-0) src/maasserver/api/subnets.py (+49/-0) src/maasserver/api/version.py (+10/-0) src/maasserver/compose_preseed.py (+25/-1) src/maasserver/config.py (+7/-1) src/maasserver/forms/tests/test_interface_link.py (+6/-1) src/maasserver/models/staticipaddress.py (+160/-0) src/maasserver/models/tests/test_staticipaddress.py (+141/-0) src/maasserver/models/tests/test_subnet.py (+20/-0) src/maasserver/preseed.py (+38/-0) src/maasserver/static/assets/images/icons/account.svg.OTHER (+1/-0) src/maasserver/static/assets/images/icons/add-logical-volume.svg.OTHER (+1/-0) src/maasserver/static/assets/images/icons/add-partition.svg.OTHER (+1/-0) src/maasserver/static/assets/images/icons/add.svg.OTHER (+1/-0) src/maasserver/static/assets/images/icons/cross-orange.svg.OTHER (+1/-0) src/maasserver/static/assets/images/icons/cross.svg.OTHER (+1/-0) src/maasserver/static/assets/images/icons/cross_orange.svg.OTHER (+1/-0) src/maasserver/static/assets/images/icons/debug.svg.OTHER (+1/-0) src/maasserver/static/assets/images/icons/delete.svg.OTHER (+1/-0) src/maasserver/static/assets/images/icons/edit.svg.OTHER (+1/-0) src/maasserver/static/assets/images/icons/green-tick.svg.OTHER (+1/-0) src/maasserver/static/assets/images/icons/help.svg.OTHER (+1/-0) src/maasserver/static/assets/images/icons/info-mono.svg.OTHER (+1/-0) src/maasserver/static/assets/images/icons/info.svg.OTHER (+1/-0) src/maasserver/static/assets/images/icons/logical-volume.svg.OTHER (+1/-0) src/maasserver/static/assets/images/icons/magnifying_glass.svg.OTHER (+1/-0) src/maasserver/static/assets/images/icons/mount.svg.OTHER (+1/-0) src/maasserver/static/assets/images/icons/partition.svg.OTHER (+1/-0) src/maasserver/static/assets/images/icons/power-error.svg.OTHER (+1/-0) src/maasserver/static/assets/images/icons/power-off.svg.OTHER (+1/-0) src/maasserver/static/assets/images/icons/power-on.svg.OTHER (+1/-0) src/maasserver/static/assets/images/icons/remove.svg.OTHER (+1/-0) src/maasserver/static/assets/images/icons/settings.svg.OTHER (+1/-0) src/maasserver/static/assets/images/icons/success-mono.svg.OTHER (+1/-0) src/maasserver/static/assets/images/icons/success.svg.OTHER (+1/-0) src/maasserver/static/assets/images/icons/success_colour_black.svg.OTHER (+1/-0) src/maasserver/static/assets/images/icons/success_colour_white.svg.OTHER (+1/-0) src/maasserver/static/assets/images/icons/success_mono.svg.OTHER (+1/-0) src/maasserver/static/assets/images/icons/sync.svg.OTHER (+1/-0) src/maasserver/static/assets/images/icons/system-shutdown.svg.OTHER (+1/-0) src/maasserver/static/assets/images/icons/tags.svg.OTHER (+1/-0) src/maasserver/static/assets/images/icons/tick.svg.OTHER (+1/-0) src/maasserver/static/assets/images/icons/tooltip.svg.OTHER (+1/-0) src/maasserver/static/assets/images/icons/unmount.svg.OTHER (+1/-0) src/maasserver/static/assets/images/icons/warning-mono.svg.OTHER (+1/-0) src/maasserver/static/assets/images/icons/warning.svg.OTHER (+1/-0) src/maasserver/static/assets/images/icons/warning_colour_black.svg.OTHER (+1/-0) src/maasserver/static/assets/images/icons/warning_colour_white.svg.OTHER (+1/-0) src/maasserver/static/assets/images/icons/warning_mono.svg.OTHER (+1/-0) src/maasserver/static/css/build.css (+1/-0) src/maasserver/static/js/angular/controllers/tests/test_node_details.js (+83/-40) src/maasserver/static/js/angular/maas.js (+5/-0) src/maasserver/static/partials/dashboard.html (+210/-0) src/maasserver/static/partials/domain-details.html (+4/-0) src/maasserver/static/partials/domains-list.html (+4/-0) src/maasserver/static/partials/error.html (+4/-0) src/maasserver/static/partials/fabric-details.html (+8/-0) src/maasserver/static/partials/intro-user.html (+33/-0) src/maasserver/static/partials/intro.html (+71/-0) src/maasserver/static/partials/networks-list.html (+4/-0) src/maasserver/static/partials/node-details.html (+102/-0) src/maasserver/static/partials/node-events.html (+13/-0) src/maasserver/static/partials/node-result.html (+8/-0) src/maasserver/static/partials/nodes-list.html (+912/-0) src/maasserver/static/partials/settings.html (+4/-0) src/maasserver/static/partials/space-details.html (+8/-0) src/maasserver/static/partials/ssh-keys.html (+17/-0) src/maasserver/static/partials/subnet-details.html (+14/-0) src/maasserver/static/partials/vlan-details.html (+10/-0) src/maasserver/static/scss/_base.forms.scss.OTHER (+377/-0) src/maasserver/static/scss/_components.buttons.scss.OTHER (+149/-0) src/maasserver/static/scss/_components.flashmessages.scss.OTHER (+59/-0) src/maasserver/static/scss/_components.forms.scss.OTHER (+201/-0) src/maasserver/static/scss/_components.icons.scss.OTHER (+274/-0) src/maasserver/static/scss/_components.tables.scss.OTHER (+668/-0) src/maasserver/static/scss/_helpers.display.scss.OTHER (+101/-0) src/maasserver/static/scss/_helpers.spacing.scss.OTHER (+48/-0) src/maasserver/static/scss/_patterns.page-header.scss.OTHER (+177/-0) src/maasserver/templates/maasserver/base.html (+4/-0) src/maasserver/tests/test_compose_preseed.py (+10/-0) src/maasserver/tests/test_listener.py (+36/-0) src/maasserver/tests/test_preseed.py (+17/-0) src/maasserver/triggers/tests/test_websocket_listener.py (+24/-0) src/maasserver/triggers/websocket.py (+38/-0) src/maasserver/websockets/handlers/node.py (+8/-0) src/maasserver/websockets/handlers/tests/test_machine.py (+4/-0) src/metadataserver/api.py (+30/-0) src/provisioningserver/boot/uefi_amd64.py (+4/-0) src/provisioningserver/import_images/boot_resources.py (+15/-0) src/provisioningserver/import_images/tests/test_boot_resources.py (+28/-0) src/provisioningserver/kernel_opts.py (+5/-0) src/provisioningserver/logger/_twisted.py (+80/-0) src/provisioningserver/logger/testing/logsomething.py (+62/-0) src/provisioningserver/logger/tests/test__twisted.py (+199/-0) src/provisioningserver/rackdservices/tests/test_tftp.py (+28/-0) src/provisioningserver/rackdservices/tftp.py (+13/-0) src/provisioningserver/refresh/node_info_scripts.py (+7/-1) src/provisioningserver/refresh/tests/test_node_info_scripts.py (+16/-0) src/provisioningserver/tests/test_kernel_opts.py (+15/-0) src/provisioningserver/utils/services.py (+3/-0) src/provisioningserver/utils/tests/test_twisted.py (+6/-0) src/provisioningserver/utils/twisted.py (+6/-0) versions.cfg (+8/-0) Text conflict in MANIFEST.in Text conflict in docs/changelog.rst Contents conflict in docs/troubleshooting.rst Text conflict in docs/version.rst Text conflict in src/maasserver/api/machines.py Text conflict in src/maasserver/api/spaces.py Text conflict in src/maasserver/api/subnets.py Text conflict in src/maasserver/api/version.py Text conflict in src/maasserver/compose_preseed.py Text conflict in src/maasserver/config.py Text conflict in src/maasserver/forms/tests/test_interface_link.py Contents conflict in src/maasserver/migrations/south/django16_south_maas19.tar.gz Text conflict in src/maasserver/models/staticipaddress.py Text conflict in src/maasserver/models/tests/test_staticipaddress.py Text conflict in src/maasserver/models/tests/test_subnet.py Text conflict in src/maasserver/preseed.py Contents conflict in src/maasserver/static/assets/images/icons/account.svg Contents conflict in src/maasserver/static/assets/images/icons/add-logical-volume.svg Contents conflict in src/maasserver/static/assets/images/icons/add-partition.svg Contents conflict in src/maasserver/static/assets/images/icons/add.svg Contents conflict in src/maasserver/static/assets/images/icons/cross-orange.svg Contents conflict in src/maasserver/static/assets/images/icons/cross.svg Contents conflict in src/maasserver/static/assets/images/icons/cross_orange.svg Contents conflict in src/maasserver/static/assets/images/icons/debug.svg Contents conflict in src/maasserver/static/assets/images/icons/delete.svg Contents conflict in src/maasserver/static/assets/images/icons/edit.svg Contents conflict in src/maasserver/static/assets/images/icons/green-tick.svg Contents conflict in src/maasserver/static/assets/images/icons/help.svg Contents conflict in src/maasserver/static/assets/images/icons/info-mono.svg Contents conflict in src/maasserver/static/assets/images/icons/info.svg Contents conflict in src/maasserver/static/assets/images/icons/logical-volume.svg Contents conflict in src/maasserver/static/assets/images/icons/magnifying_glass.svg Contents conflict in src/maasserver/static/assets/images/icons/mount.svg Contents conflict in src/maasserver/static/assets/images/icons/partition.svg Contents conflict in src/maasserver/static/assets/images/icons/power-error.svg Contents conflict in src/maasserver/static/assets/images/icons/power-off.svg Contents conflict in src/maasserver/static/assets/images/icons/power-on.svg Contents conflict in src/maasserver/static/assets/images/icons/remove.svg Contents conflict in src/maasserver/static/assets/images/icons/settings.svg Contents conflict in src/maasserver/static/assets/images/icons/success-mono.svg Contents conflict in src/maasserver/static/assets/images/icons/success.svg Contents conflict in src/maasserver/static/assets/images/icons/success_colour_black.svg Contents conflict in src/maasserver/static/assets/images/icons/success_colour_white.svg Contents conflict in src/maasserver/static/assets/images/icons/success_mono.svg Contents conflict in src/maasserver/static/assets/images/icons/sync.svg Contents conflict in src/maasserver/static/assets/images/icons/system-shutdown.svg Contents conflict in src/maasserver/static/assets/images/icons/tags.svg Contents conflict in src/maasserver/static/assets/images/icons/tick.svg Contents conflict in src/maasserver/static/assets/images/icons/tooltip.svg Contents conflict in src/maasserver/static/assets/images/icons/unmount.svg Contents conflict in src/maasserver/static/assets/images/icons/warning-mono.svg Contents conflict in src/maasserver/static/assets/images/icons/warning.svg Contents conflict in src/maasserver/static/assets/images/icons/warning_colour_black.svg Contents conflict in src/maasserver/static/assets/images/icons/warning_colour_white.svg Contents conflict in src/maasserver/static/assets/images/icons/warning_mono.svg Conflict adding file src/maasserver/static/css/build.css. Moved existing file to src/maasserver/static/css/build.css.moved. Text conflict in src/maasserver/static/js/angular/controllers/tests/test_node_details.js Text conflict in src/maasserver/static/js/angular/maas.js Text conflict in src/maasserver/static/partials/dashboard.html Text conflict in src/maasserver/static/partials/domain-details.html Text conflict in src/maasserver/static/partials/domains-list.html Text conflict in src/maasserver/static/partials/error.html Text conflict in src/maasserver/static/partials/fabric-details.html Text conflict in src/maasserver/static/partials/intro-user.html Text conflict in src/maasserver/static/partials/intro.html Text conflict in src/maasserver/static/partials/networks-list.html Text conflict in src/maasserver/static/partials/node-details.html Text conflict in src/maasserver/static/partials/node-events.html Text conflict in src/maasserver/static/partials/node-result.html Text conflict in src/maasserver/static/partials/nodes-list.html Text conflict in src/maasserver/static/partials/settings.html Text conflict in src/maasserver/static/partials/space-details.html Text conflict in src/maasserver/static/partials/ssh-keys.html Text conflict in src/maasserver/static/partials/subnet-details.html Text conflict in src/maasserver/static/partials/vlan-details.html Contents conflict in src/maasserver/static/scss/_base.forms.scss Contents conflict in src/maasserver/static/scss/_components.buttons.scss Contents conflict in src/maasserver/static/scss/_components.flashmessages.scss Contents conflict in src/maasserver/static/scss/_components.forms.scss Contents conflict in src/maasserver/static/scss/_components.icons.scss Contents conflict in src/maasserver/static/scss/_components.tables.scss Contents conflict in src/maasserver/static/scss/_helpers.display.scss Contents conflict in src/maasserver/static/scss/_helpers.spacing.scss Contents conflict in src/maasserver/static/scss/_patterns.page-header.scss Text conflict in src/maasserver/templates/maasserver/base.html Text conflict in src/maasserver/tests/test_compose_preseed.py Text conflict in src/maasserver/tests/test_listener.py Text conflict in src/maasserver/triggers/tests/test_websocket_listener.py Text conflict in src/maasserver/triggers/websocket.py Text conflict in src/maasserver/websockets/handlers/node.py Text conflict in src/maasserver/websockets/handlers/tests/test_machine.py Text conflict in src/metadataserver/api.py Text conflict in src/provisioningserver/boot/uefi_amd64.py Text conflict in src/provisioningserver/import_images/boot_resources.py Text conflict in src/provisioningserver/import_images/tests/test_boot_resources.py Text conflict in src/provisioningserver/kernel_opts.py Text conflict in src/provisioningserver/logger/_twisted.py Text conflict in src/provisioningserver/logger/testing/logsomething.py Text conflict in src/provisioningserver/logger/tests/test__twisted.py Text conflict in src/provisioningserver/rackdservices/tests/test_tftp.py Text conflict in src/provisioningserver/rackdservices/tftp.py Text conflict in src/provisioningserver/refresh/tests/test_node_info_scripts.py Text conflict in src/provisioningserver/tests/test_kernel_opts.py Text conflict in src/provisioningserver/utils/services.py Text conflict in src/provisioningserver/utils/tests/test_twisted.py Text conflict in src/provisioningserver/utils/twisted.py Text conflict in versions.cfg |
||||
To merge this branch: | bzr merge lp:~ltrager/maas/lp1685361_2.1 | ||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
MAAS Maintainers | Pending | ||
Review via email: mp+323113@code.launchpad.net |
Commit message
Fix 00-maas-
Description of the change
To post a comment you must log in.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'MANIFEST.in' |
2 | --- MANIFEST.in 2017-03-10 16:34:33 +0000 |
3 | +++ MANIFEST.in 2017-04-25 09:34:40 +0000 |
4 | @@ -1,8 +1,19 @@ |
5 | +<<<<<<< TREE |
6 | graft src/maasserver/static |
7 | graft src/maasserver/templates |
8 | graft src/metadataserver/fixtures |
9 | graft src/metadataserver/user_data/templates |
10 | graft src/provisioningserver/templates |
11 | +======= |
12 | +graft src/maasserver/static |
13 | +graft src/maasserver/templates |
14 | +graft src/metadataserver/fixtures |
15 | +graft src/provisioningserver/templates |
16 | +>>>>>>> MERGE-SOURCE |
17 | include src/maasserver/migrations/south/django16_south_maas19.tar.gz |
18 | +<<<<<<< TREE |
19 | include src/provisioningserver/drivers/power/*.xml |
20 | include src/metadataserver/builtin_scripts/*.sh |
21 | +======= |
22 | +include src/provisioningserver/drivers/power/*.xml |
23 | +>>>>>>> MERGE-SOURCE |
24 | |
25 | === modified file 'contrib/preseeds_v2/curtin_userdata' |
26 | === modified file 'docs/changelog.rst' |
27 | --- docs/changelog.rst 2017-02-17 14:23:04 +0000 |
28 | +++ docs/changelog.rst 2017-04-25 09:34:40 +0000 |
29 | @@ -2,8 +2,207 @@ |
30 | Changelog |
31 | ========= |
32 | |
33 | +<<<<<<< TREE |
34 | 2.2.0 (beta1) |
35 | ============= |
36 | +======= |
37 | +2.1.6 |
38 | +===== |
39 | + |
40 | +Bugs fixed in this release |
41 | +-------------------------- |
42 | + |
43 | +LP: #1677507 Fix potential IP allocation from incorrect range. |
44 | + |
45 | +LP: #1674807 Fix missing default_gateways entry in machine API output. |
46 | + |
47 | + |
48 | +2.1.5 |
49 | +===== |
50 | + |
51 | +Bugs fixed in this release |
52 | +-------------------------- |
53 | + |
54 | +LP: #1671891 Fix deployment with AUTO IPs set as the gateway link. |
55 | + |
56 | +LP: #1671048 Fix crash when getting the default gateways for a machine. |
57 | + |
58 | +LP: #1673916 Fix regression that causes traceback in rack-based mDNS monitoring service. |
59 | + |
60 | +LP: #1673724 Due to a potential regression in lsblk, try to ensure list of block devices is ordered correctly. |
61 | + |
62 | + |
63 | +2.1.4 |
64 | +===== |
65 | + |
66 | +Bugs fixed in this release |
67 | +-------------------------- |
68 | + |
69 | +LP: #1655049 Prevent IndexError in get_vendor_for_mac() |
70 | + |
71 | +LP: #1654432 Unable to deploy ga kernel on node-details page |
72 | + |
73 | +LP: #1654450 MAAS shouldn't show newer kernels when edge kernels are added |
74 | + |
75 | +LP: #1654412 Unable to set edge kernel as the min_hwe_kernel and deploy with the default kernel |
76 | + |
77 | +LP: #1656425 Ephemeral environments using the wrong kernel |
78 | + |
79 | +LP: #1655721 MAAS shouldn't update TGT config when there are no boot sources |
80 | + |
81 | +LP: #1659511 Fix incorrect clearing of boot resource cache if an IOError occurs. |
82 | + |
83 | +LP: #1659607 Usability fixes for interfaces API link-subnet operation |
84 | + |
85 | +LP: #1640147 Do not attempt IPv6 discovery on interfaces where IPv6 is disabled |
86 | + |
87 | +LP: #1626654 Make connection attempts from rack to region controllers more reliable |
88 | + |
89 | +LP: #1626654 Fix reports of bad connections when dead regiond workers remain in the database |
90 | + |
91 | +LP: #1645912 Fix IPMI autodetection to wrap IPv6 addresses in brackers when used inside URLs |
92 | + |
93 | +LP: #1665459 Fix anonymous auto-enlistment to properly detect rack-facing region IP address |
94 | + |
95 | +LP: #1665143 Select the shortest by-id path when discovering block devices to address issues when discovering nvme devices. |
96 | + |
97 | + |
98 | +Other notable changes |
99 | +--------------------- |
100 | + |
101 | +It is now possible to prevent deploying machines from rebooting. |
102 | + |
103 | + |
104 | +2.1.3 |
105 | +===== |
106 | + |
107 | +Bugs fixed in this release |
108 | +-------------------------- |
109 | + |
110 | +LP: #1611999 [2.1] MAAS cannot power query with Cisco UCSM power driver. |
111 | + |
112 | +LP: #1604962 node set to "failed deployment" for no visible reason |
113 | + |
114 | +LP: #1614584 MAAS fails to start when gethostname returns an FQDN. |
115 | + |
116 | +LP: #1582323 Select MAAS datasource specifically to ensure commissioning doesn't fail when competing cloud metadata resides on disk |
117 | + |
118 | +LP: #1646163 [2.1] Icon need to be improved |
119 | + |
120 | +LP: #1646162 [2.1] Sticky header has been removed |
121 | + |
122 | +LP: #1646160 [2.1] Device discovery UI does not have a loading state |
123 | + |
124 | +LP: #1628126 [2.1, FUJ] Column layout shouldn't resize until screen is smaller than 1440 |
125 | + |
126 | +LP: #1628058 [2.1, FUJ] The form spacing is not compatible to the designs |
127 | + |
128 | +LP: #1628054 [2.1, FUJ] Section complete/incomplete icon |
129 | + |
130 | +LP: #1639182 [2.1] log format differs for Yakkety |
131 | + |
132 | +LP: #1637401 Re-adding virsh chassis to discover new nodes powers down existing nodes |
133 | + |
134 | +LP: #1642033 IPs with multiple names can corrupt DNS zone data |
135 | + |
136 | +LP: #1646955 'main_archive_hostname' is not defined |
137 | + |
138 | +LP: #1651452 Use correct escaping for EFI's kernel command line datasource_list. |
139 | + |
140 | + |
141 | +2.1.2 |
142 | +===== |
143 | + |
144 | +Bugs fixed in this release |
145 | +-------------------------- |
146 | + |
147 | +LP: #1516065 Fix IPMI chassis config session timeout issue when configuring the boot device. Only error on PowerAuthErrors when configuring the IPMI chassis boot order. |
148 | + |
149 | +LP: #1642996 2.x preseeds with {{escape.shell}} fail if not upgraded at 2.1.1 |
150 | + |
151 | +LP: #1643057 juju2 with maas 2.1.1 LXD containers get wrong ip addresses |
152 | + |
153 | +LP: #1640300 Be defensive in the postgresql listener when a system notification is received for a none existent handler or missing listener channel. |
154 | + |
155 | +LP: #1613862 Re-allow configuration of the port where to connect to postgresql. |
156 | + |
157 | +LP: #1638575 Add two capabilities: bridging-interface-ubuntu and bridging-automatic-ubuntu. |
158 | + |
159 | + |
160 | +2.1.1 |
161 | +===== |
162 | + |
163 | +Bugs fixed in this release |
164 | +-------------------------- |
165 | + |
166 | +LP: #1554636 maas serving old image to nodes |
167 | + |
168 | +LP: #1593991 [2.0b7, API/CLI] allows you to add machines with power_type and no power_parameters |
169 | + |
170 | +LP: #1602482 [2.0rc2] Incorrect DNS records |
171 | + |
172 | +LP: #1620478 [2.1, UI] Broken validation on VLAN MTU |
173 | + |
174 | +LP: #1630636 [2.1 ipv6] YAML error when maas_url has an IPv6 IP |
175 | + |
176 | +LP: #1630679 [2.1b1] Can't use custom image repository |
177 | + |
178 | +LP: #1633717 [2.1] DHCP probe needs to be smarter about interface selection to avoid log spam |
179 | + |
180 | +LP: #1636858 [2.1.1, trunk, bzr5510] Can't enlist machines |
181 | + |
182 | +LP: #1636861 [2.1.1, trunk, bzr5510] UI error when adding a chassis |
183 | + |
184 | +LP: #1636992 [2.1] Deleting all boot sources and creating a new boot source, does not update the cache |
185 | + |
186 | +LP: #1598175 [2.0] If the machine is deployed, I cannot update NIC's nor storage |
187 | + |
188 | +LP: #1603563 [2.0 RC2] Multiple failures to release nodes |
189 | + |
190 | +LP: #1606508 [2.1] Failover peers must be IPv4 for use with ISC dhcpd |
191 | + |
192 | +LP: #1632853 [2.1] Observed neighbours should be avoided when assigning IP addresses |
193 | + |
194 | +LP: #1633401 [2.1] In device discovery in Settings, remove the header of the first dropdown field (Host discovery and network observation) |
195 | + |
196 | +LP: #1633452 [2.1] In settings, rename the option Disabled (suppress active scanning) in the Active discovery interval field to Never (disabled). |
197 | + |
198 | +LP: #1633462 [2.1] In settings in the device discovery section reduce the text of the explanation of the fields. |
199 | + |
200 | +LP: #1633822 [2.1] Device discovery ignores reverse DNS |
201 | + |
202 | +LP: #1636250 [2.1] machines allocate API returns a random machine if incorrect - parameters are used |
203 | + |
204 | +LP: #1636873 [2.1.0] Creating a bond doesn't work and no feedback is provided if fabric in interfaces is 'disconnected' |
205 | + |
206 | +LP: #1636874 [2.1, Yakkety] Plus '+' button is not visible when you hover over an interface in machine details |
207 | + |
208 | +LP: #1637009 [2.0,2.1] Node acquisition constraints API documentation needs to be updated to match reality |
209 | + |
210 | +LP: #1637182 Help and documentation 'list of unicodes' inconsistent |
211 | + |
212 | +LP: #1637192 [2.0,2.1] Allocate using subnets or not_subnets with space fails |
213 | + |
214 | +LP: #1637246 MaaS should use configured names for VLAN interfaces |
215 | + |
216 | +LP: #1638284 [2.1.1pre] Debug logging shown by default in regiond.conf |
217 | + |
218 | +LP: #1638288 [2.1.1 pre] A lot of repeated logging |
219 | + |
220 | +LP: #1638589 [2.1] commissioning doesn't find the second address family on the boot interface |
221 | + |
222 | +LP: #1600328 [2.0rc1, API/CLI] When adding a new machine and no rack controller can connect to the BMC, no error message is displayed. |
223 | + |
224 | +LP: #1633378 [Device Discovery] Rename the section Header in the Settings page |
225 | + |
226 | +LP: #1633600 [2.1.1] Docs do not mention the need to mirror bootloaders |
227 | + |
228 | +LP: #1636251 resolv.conf search path doesn't match the domain for the host |
229 | + |
230 | + |
231 | +2.1.0 |
232 | +===== |
233 | +>>>>>>> MERGE-SOURCE |
234 | |
235 | Important announcements |
236 | ----------------------- |
237 | |
238 | === added file 'docs/troubleshooting.rst.OTHER' |
239 | --- docs/troubleshooting.rst.OTHER 1970-01-01 00:00:00 +0000 |
240 | +++ docs/troubleshooting.rst.OTHER 2017-04-25 09:34:40 +0000 |
241 | @@ -0,0 +1,200 @@ |
242 | +******************** |
243 | +MAAS Troubleshooting |
244 | +******************** |
245 | + |
246 | +Some parts of MAAS may still be a little confusing, and sometimes you might be |
247 | +trying to do things that are just plain impossible. This section covers some of |
248 | +the most commonly encountered problems and tries its best to make them gone. |
249 | + |
250 | +.. contents:: Contents |
251 | + :depth: 1 |
252 | + :local: |
253 | + |
254 | + |
255 | +Nodes hang on "Commissioning" |
256 | +============================= |
257 | + |
258 | + |
259 | +Possible Cause: Timing issues |
260 | +----------------------------- |
261 | + |
262 | +Various parts of MAAS rely on OAuth to negotiate a connection to nodes. If the |
263 | +current time reported by the hardware clock on your node differs significantly |
264 | +from that on the MAAS server, the connection will not be made. |
265 | + |
266 | +**SOLUTION:** Check that the hardware clocks are consistent, and if necessary, |
267 | +adjust them. This can usually be done from within the system BIOS, without |
268 | +needing to install an OS |
269 | + |
270 | + |
271 | +Possible Cause: Network drivers |
272 | +------------------------------- |
273 | + |
274 | +Sometimes the hardware can boot from PXE, but fail to load correct drivers when |
275 | +booting the received image. This is sometimes the case when no open source |
276 | +drivers are available for the network hardware. |
277 | + |
278 | +**SOLUTION:** The best fix for this problem is to install a Linux-friendly |
279 | +network adapter. It *is* theoretically possible to modify the boot image to |
280 | +include proprietary drivers, but it is not a straightforward task. |
281 | + |
282 | + |
283 | +Nodes fail to PXE boot |
284 | +====================== |
285 | + |
286 | + |
287 | +Possible Cause: Using an incorrectly configured VM |
288 | +-------------------------------------------------- |
289 | + |
290 | +Some Virtual Machine setups include emulation of network hardware that does not |
291 | +support PXE booting, and in most setups, you will need to explicitly set up the |
292 | +VM to boot via PXE. |
293 | + |
294 | +**SOLUTION**: Consult the VM docs for details of PXE booting. |
295 | + |
296 | + |
297 | +Possible Cause: DHCP conflict |
298 | +----------------------------- |
299 | + |
300 | +If you are using MAAS in a setup with an existing DHCP, *DO NOT SET UP THE MAAS |
301 | +DHCP SERVER* as this will cause no end of confusion to the rest of your network |
302 | +and most likely won't discover any nodes either. |
303 | + |
304 | +**SOLUTION**: You will need to configure your existing DHCP server to |
305 | +point to the MAAS server. |
306 | + |
307 | + |
308 | +Can't log in to node |
309 | +==================== |
310 | + |
311 | +Sometimes you may wish to login directly to a node on your system. If |
312 | +you have set up Juju and MAAS, the attached nodes will automatically |
313 | +receive existing ssh keys and sets up ssh on the node to authenticate |
314 | +via key, so you can just login with no password from the server. |
315 | +There is also an option in the MAAS web interface to add new ssh keys |
316 | +to the nodes (via Preferences in the drop down menu which appears when |
317 | +clicking your username in the top-right of the page). |
318 | + |
319 | + |
320 | +Forgot MAAS superuser password |
321 | +============================== |
322 | + |
323 | +As long as you have sudo privileges, this is not a disaster. You can |
324 | +use the ``maas`` command to change the password for the MAAS superuser |
325 | +on the MAAS server: |
326 | + |
327 | + ``sudo maas changepassword root`` |
328 | + |
329 | + |
330 | +Need to reconfigure server IP address |
331 | +===================================== |
332 | + |
333 | +If you made a mistake during setup or you just need to reconfigure your MAAS |
334 | +server, you can simply run the setup again: |
335 | + |
336 | + ``sudo dpkg-reconfigure maas-region-controller`` |
337 | + |
338 | + |
339 | +Can't find MAAS webpage |
340 | +======================= |
341 | + |
342 | +The default webpage is located at ``http://<hostname>/MAAS/``. If you can't |
343 | +access it, there are a few things to try: |
344 | + |
345 | + #. Check that the webserver is running - By default the web interface uses |
346 | + Apache, which runs under the service name *apache2*. To check it, on the |
347 | + MAAS server box you can run ``sudo /etc/init.d/apache2 status``. |
348 | + #. Check that the hostname is correct - It may seem obvious, but check that |
349 | + the hostname is being resolved properly. Try running a browser (even a text |
350 | + mode one like lynx) on the same box as the MAAS server and navigating to |
351 | + the page. If that doesn't work, try ``http://127.0.0.1/MAAS/``, which will |
352 | + always point at the local server. |
353 | + #. If you are still getting "404 - Page not found" errors, check that the MAAS |
354 | + web interface has been installed in the right place. There should be a file |
355 | + present called /usr/share/maas/maas/urls.py |
356 | + |
357 | +Debugging ephemeral image |
358 | +========================= |
359 | + |
360 | +Backdoor (add a login) to ephemeral images |
361 | +------------------------------------------ |
362 | + |
363 | +If you cannot login to an instance, you might have to "backdoor it" in order |
364 | +to see what is going wrong. Scott Moser wrote a simple utility that injects a |
365 | +user and password into an image. Here's how to add a 'backdoor' user with a |
366 | +password to your images:: |
367 | + |
368 | + sudo apt-get install --assume-yes bzr |
369 | + bzr branch lp:~maas-maintainers/maas/backdoor-image backdoor-image |
370 | + |
371 | + imgs=$(echo /var/lib/maas/boot-resources/*/*/*/*/*/*/root-image) |
372 | + for img in $imgs; do |
373 | + [ -f "$img.dist" ] || sudo cp -a --sparse=always $img $img.dist |
374 | + done |
375 | + |
376 | + for img in $imgs; do |
377 | + sudo ./backdoor-image/backdoor-image -v --user=backdoor --password-auth --password=ubuntu $img |
378 | + done |
379 | + |
380 | +Inside the ephemeral image |
381 | +-------------------------- |
382 | + |
383 | +Important files for debugging (Someone is likely to ask you for these |
384 | +things to help debug):: |
385 | + |
386 | + /var/log/cloud-init.log |
387 | + /var/log/boot.log |
388 | + /var/log/cloud-init-output.log |
389 | + |
390 | +After enlistment or commissioning, the user-data from maas instructs the system |
391 | +to power off. To stop that from happening, you can just create a file in /tmp:: |
392 | + |
393 | + touch /tmp/block-poweroff |
394 | + |
395 | +After a deployment, the user-data from maas intructs the system to reboot. To |
396 | +stop that from happening, you can just create a file in /tmp:: |
397 | + |
398 | + touch /tmp/block-reboot |
399 | + |
400 | +MAAS credentials |
401 | +---------------- |
402 | + |
403 | +MAAS credentials can be found in 2 places: |
404 | + |
405 | +#. from the cmdline you'll see a ``url=`` or ``cloud-config-url=`` |
406 | + parameter. You can get the cloud-config from that url, which will have |
407 | + credentials:: |
408 | + |
409 | + $ sed -n 's,.*url=\([^ ]*\).*,\1,p' /proc/cmdline |
410 | + http://10.55.60.194/MAAS/metadata/latest/enlist-preseed/?op=get_enlist_preseed |
411 | + |
412 | +#. from ``/etc/cloud/cloud.cfg.d/91_kernel_cmdline_url``. The file was pulled |
413 | + from ``url=`` parameter by cloud-init:: |
414 | + |
415 | + $ sudo cat /etc/cloud/cloud.cfg.d/91_kernel_cmdline |
416 | + |
417 | +MAAS datasource |
418 | +--------------- |
419 | + |
420 | +The cloud-init datasource for MAAS can be invoked as a 'main' for debugging |
421 | +purposes. To do so, you need to know the url for the MAAS datasource and a |
422 | +config file that contains credentials:: |
423 | + |
424 | + cfg=$(echo /etc/cloud/cloud.cfg.d/*_cmdline_url.cfg) |
425 | + echo $cfg /etc/cloud/cloud.cfg.d/91_kernel_cmdline_url.cfg |
426 | + |
427 | +Now get the metadata_url from there:: |
428 | + |
429 | + url=$(sudo awk '$1 == "metadata_url:" { print $2 }' $cfg) |
430 | + echo $url http://10.55.60.194/MAAS/metadata/enlist |
431 | + |
432 | +Invoke the client /usr/share/pyshared/cloudinit/sources/DataSourceMAAS.py |
433 | +The client has --help Usage also, but here is an example of how to use it:: |
434 | + |
435 | + $ maasds="/usr/share/pyshared/cloudinit/sources/DataSourceMAAS.py" |
436 | + $ sudo python $maasds --config=$cfg get $url |
437 | + == http://10.55.60.194/MAAS/metadata/enlist == |
438 | + 2012-03-01 |
439 | + latest |
440 | + $ sudo python $maasds --config=$cfg get $url/latest/meta-data/local-hostname |
441 | + maas-enlisting-node |
442 | |
443 | === modified file 'docs/version.rst' |
444 | --- docs/version.rst 2017-03-15 07:43:23 +0000 |
445 | +++ docs/version.rst 2017-04-25 09:34:40 +0000 |
446 | @@ -67,6 +67,7 @@ |
447 | Deploy nodes with custom network layout and configuration. Available since |
448 | version 1.9 on Ubuntu deployments. See :ref:`networking` for more about this |
449 | feature. |
450 | +<<<<<<< TREE |
451 | |
452 | .. _cap_bridging-interface-ubuntu: |
453 | |
454 | @@ -87,3 +88,17 @@ |
455 | Clients can pass a username and password and, assuming they are valid, |
456 | receive in return an API token. The caller is *not* logged-in to MAAS |
457 | via a session cookie. |
458 | +======= |
459 | + |
460 | +.. _cap_bridging-interface-ubuntu: |
461 | + |
462 | +``bridging-interface-ubuntu`` |
463 | + Deploy nodes, selectively configuring bridges on network interfaces. |
464 | + Available since 2.1 on Ubuntu deployments. |
465 | + |
466 | +.. _cap_bridging-automatic-ubuntu: |
467 | + |
468 | +``bridging-automatic-ubuntu`` |
469 | + Deploy nodes, automatically configuring bridges on all interfaces. |
470 | + Available since 2.1 on Ubuntu deployments. |
471 | +>>>>>>> MERGE-SOURCE |
472 | |
473 | === modified file 'setup.py' |
474 | === modified file 'src/maasserver/api/blockdevices.py' |
475 | === modified file 'src/maasserver/api/boot_resources.py' |
476 | === modified file 'src/maasserver/api/boot_source_selections.py' |
477 | === modified file 'src/maasserver/api/dhcpsnippets.py' |
478 | === modified file 'src/maasserver/api/dnsresourcerecords.py' |
479 | === modified file 'src/maasserver/api/dnsresources.py' |
480 | === modified file 'src/maasserver/api/domains.py' |
481 | === modified file 'src/maasserver/api/fabrics.py' |
482 | === modified file 'src/maasserver/api/fannetworks.py' |
483 | === modified file 'src/maasserver/api/interfaces.py' |
484 | === modified file 'src/maasserver/api/ipranges.py' |
485 | === modified file 'src/maasserver/api/machines.py' |
486 | --- src/maasserver/api/machines.py 2017-04-21 20:20:53 +0000 |
487 | +++ src/maasserver/api/machines.py 2017-04-25 09:34:40 +0000 |
488 | @@ -135,11 +135,15 @@ |
489 | 'node_type', |
490 | 'node_type_name', |
491 | 'special_filesystems', |
492 | +<<<<<<< TREE |
493 | 'pod', |
494 | 'default_gateways', |
495 | 'current_commissioning_result_id', |
496 | 'current_testing_result_id', |
497 | 'current_installation_result_id', |
498 | +======= |
499 | + 'default_gateways', |
500 | +>>>>>>> MERGE-SOURCE |
501 | ) |
502 | |
503 | # Limited set of machine fields exposed on the anonymous API. |
504 | @@ -220,6 +224,7 @@ |
505 | """The network interface which is used to boot over the network.""" |
506 | return machine.get_boot_interface() |
507 | |
508 | +<<<<<<< TREE |
509 | @classmethod |
510 | def pod(handler, machine): |
511 | """The pod this machine is part of.""" |
512 | @@ -279,6 +284,25 @@ |
513 | } |
514 | } |
515 | |
516 | +======= |
517 | + @classmethod |
518 | + def default_gateways(handler, machine): |
519 | + """The default gateways that will be used for this machine.""" |
520 | + gateways = machine.get_default_gateways() |
521 | + ipv4 = gateways.ipv4.gateway_ip if gateways.ipv4 is not None else None |
522 | + ipv6 = gateways.ipv6.gateway_ip if gateways.ipv6 is not None else None |
523 | + return { |
524 | + "ipv4": { |
525 | + "gateway_ip": ipv4, |
526 | + "link_id": machine.gateway_link_ipv4_id, |
527 | + }, |
528 | + "ipv6": { |
529 | + "gateway_ip": ipv6, |
530 | + "link_id": machine.gateway_link_ipv6_id, |
531 | + } |
532 | + } |
533 | + |
534 | +>>>>>>> MERGE-SOURCE |
535 | @admin_method |
536 | def update(self, request, system_id): |
537 | """Update a specific Machine. |
538 | |
539 | === modified file 'src/maasserver/api/nodes.py' |
540 | === modified file 'src/maasserver/api/packagerepositories.py' |
541 | === modified file 'src/maasserver/api/partitions.py' |
542 | === modified file 'src/maasserver/api/spaces.py' |
543 | --- src/maasserver/api/spaces.py 2017-02-17 14:23:04 +0000 |
544 | +++ src/maasserver/api/spaces.py 2017-04-25 09:34:40 +0000 |
545 | @@ -117,6 +117,7 @@ |
546 | |
547 | @classmethod |
548 | def subnets(cls, space): |
549 | +<<<<<<< TREE |
550 | # Backward compatibility for Juju 2.0. |
551 | if space.id == -1: |
552 | return Subnet.objects.filter(vlan__space__isnull=True) |
553 | @@ -130,6 +131,12 @@ |
554 | return space.vlan_set.all() |
555 | |
556 | def read(self, request, id): |
557 | +======= |
558 | + """Return all subnets in this space.""" |
559 | + return space.subnet_set.all() |
560 | + |
561 | + def read(self, request, id): |
562 | +>>>>>>> MERGE-SOURCE |
563 | """Read space. |
564 | |
565 | Returns 404 if the space is not found. |
566 | |
567 | === modified file 'src/maasserver/api/staticroutes.py' |
568 | === modified file 'src/maasserver/api/subnets.py' |
569 | --- src/maasserver/api/subnets.py 2017-04-06 18:19:08 +0000 |
570 | +++ src/maasserver/api/subnets.py 2017-04-25 09:34:40 +0000 |
571 | @@ -153,13 +153,19 @@ |
572 | return Space.UNDEFINED |
573 | return subnet.space.get_name() |
574 | |
575 | +<<<<<<< TREE |
576 | def read(self, request, id): |
577 | """\ |
578 | Read subnet. |
579 | +======= |
580 | + def read(self, request, id): |
581 | + """Read subnet. |
582 | +>>>>>>> MERGE-SOURCE |
583 | |
584 | Returns 404 if the subnet is not found. |
585 | """ |
586 | return Subnet.objects.get_subnet_or_404( |
587 | +<<<<<<< TREE |
588 | id, request.user, NODE_PERMISSION.VIEW) |
589 | |
590 | def update(self, request, id): |
591 | @@ -201,6 +207,24 @@ |
592 | |
593 | managed |
594 | If False, MAAS should not manage this subnet. (Default: True) |
595 | +======= |
596 | + id, request.user, NODE_PERMISSION.VIEW) |
597 | + |
598 | + def update(self, request, id): |
599 | + """Update subnet. |
600 | + |
601 | + :param name: Name of the subnet. |
602 | + :param description: Description of the subnet. |
603 | + :param vlan: VLAN this subnet belongs to. |
604 | + :param space: Space this subnet is in. |
605 | + :param cidr: The network CIDR for this subnet. |
606 | + :param gateway_ip: The gateway IP address for this subnet. |
607 | + :param rdns_mode: How reverse DNS is handled for this subnet. |
608 | + :param allow_proxy: Configure maas-proxy to allow requests from this \ |
609 | + subnet. |
610 | + :param dns_servers: Comma-seperated list of DNS servers for this \ |
611 | + subnet. |
612 | +>>>>>>> MERGE-SOURCE |
613 | |
614 | Returns 404 if the subnet is not found. |
615 | """ |
616 | @@ -212,9 +236,14 @@ |
617 | else: |
618 | raise MAASAPIValidationError(form.errors) |
619 | |
620 | +<<<<<<< TREE |
621 | def delete(self, request, id): |
622 | """\ |
623 | Delete subnet. |
624 | +======= |
625 | + def delete(self, request, id): |
626 | + """Delete subnet. |
627 | +>>>>>>> MERGE-SOURCE |
628 | |
629 | Returns 404 if the subnet is not found. |
630 | """ |
631 | @@ -224,9 +253,14 @@ |
632 | return rc.DELETED |
633 | |
634 | @operation(idempotent=True) |
635 | +<<<<<<< TREE |
636 | def reserved_ip_ranges(self, request, id): |
637 | """\ |
638 | Lists IP ranges currently reserved in the subnet. |
639 | +======= |
640 | + def reserved_ip_ranges(self, request, id): |
641 | + """Lists IP ranges currently reserved in the subnet. |
642 | +>>>>>>> MERGE-SOURCE |
643 | |
644 | Returns 404 if the subnet is not found. |
645 | """ |
646 | @@ -235,9 +269,14 @@ |
647 | return subnet.get_ipranges_in_use().render_json() |
648 | |
649 | @operation(idempotent=True) |
650 | +<<<<<<< TREE |
651 | def unreserved_ip_ranges(self, request, id): |
652 | """\ |
653 | Lists IP ranges currently unreserved in the subnet. |
654 | +======= |
655 | + def unreserved_ip_ranges(self, request, id): |
656 | + """Lists IP ranges currently unreserved in the subnet. |
657 | +>>>>>>> MERGE-SOURCE |
658 | |
659 | Returns 404 if the subnet is not found. |
660 | """ |
661 | @@ -247,8 +286,13 @@ |
662 | include_purpose=False) |
663 | |
664 | @operation(idempotent=True) |
665 | +<<<<<<< TREE |
666 | def statistics(self, request, id): |
667 | """\ |
668 | +======= |
669 | + def statistics(self, request, id): |
670 | + """ |
671 | +>>>>>>> MERGE-SOURCE |
672 | Returns statistics for the specified subnet, including: |
673 | |
674 | num_available: the number of available IP addresses |
675 | @@ -286,8 +330,13 @@ |
676 | include_suggestions=include_suggestions) |
677 | |
678 | @operation(idempotent=True) |
679 | +<<<<<<< TREE |
680 | def ip_addresses(self, request, id): |
681 | """\ |
682 | +======= |
683 | + def ip_addresses(self, request, id): |
684 | + """ |
685 | +>>>>>>> MERGE-SOURCE |
686 | Returns a summary of IP addresses assigned to this subnet. |
687 | |
688 | Optional parameters |
689 | |
690 | === modified file 'src/maasserver/api/tests/test_api.py' |
691 | === modified file 'src/maasserver/api/tests/test_blockdevice.py' |
692 | === modified file 'src/maasserver/api/tests/test_boot_resources.py' |
693 | === modified file 'src/maasserver/api/tests/test_dhcpsnippets.py' |
694 | === modified file 'src/maasserver/api/tests/test_enlistment.py' |
695 | === modified file 'src/maasserver/api/tests/test_interfaces.py' |
696 | === modified file 'src/maasserver/api/tests/test_machine.py' |
697 | === modified file 'src/maasserver/api/tests/test_vlans.py' |
698 | === modified file 'src/maasserver/api/tests/test_volume_groups.py' |
699 | === modified file 'src/maasserver/api/version.py' |
700 | --- src/maasserver/api/version.py 2017-03-15 07:43:23 +0000 |
701 | +++ src/maasserver/api/version.py 2017-04-25 09:34:40 +0000 |
702 | @@ -21,9 +21,14 @@ |
703 | CAP_DEVICES_MANAGEMENT = 'devices-management' |
704 | CAP_STORAGE_DEPLOYMENT_UBUNTU = 'storage-deployment-ubuntu' |
705 | CAP_NETWORK_DEPLOYMENT_UBUNTU = 'network-deployment-ubuntu' |
706 | +<<<<<<< TREE |
707 | CAP_BRIDGING_INTERFACE_UBUNTU = 'bridging-interface-ubuntu' |
708 | CAP_BRIDGING_AUTOMATIC_UBUNTU = 'bridging-automatic-ubuntu' |
709 | CAP_AUTHENTICATE_API = 'authenticate-api' |
710 | +======= |
711 | +CAP_BRIDGING_INTERFACE_UBUNTU = 'bridging-interface-ubuntu' |
712 | +CAP_BRIDGING_AUTOMATIC_UBUNTU = 'bridging-automatic-ubuntu' |
713 | +>>>>>>> MERGE-SOURCE |
714 | |
715 | API_CAPABILITIES_LIST = [ |
716 | CAP_NETWORKS_MANAGEMENT, |
717 | @@ -32,9 +37,14 @@ |
718 | CAP_DEVICES_MANAGEMENT, |
719 | CAP_STORAGE_DEPLOYMENT_UBUNTU, |
720 | CAP_NETWORK_DEPLOYMENT_UBUNTU, |
721 | +<<<<<<< TREE |
722 | CAP_BRIDGING_INTERFACE_UBUNTU, |
723 | CAP_BRIDGING_AUTOMATIC_UBUNTU, |
724 | CAP_AUTHENTICATE_API, |
725 | +======= |
726 | + CAP_BRIDGING_INTERFACE_UBUNTU, |
727 | + CAP_BRIDGING_AUTOMATIC_UBUNTU, |
728 | +>>>>>>> MERGE-SOURCE |
729 | ] |
730 | |
731 | |
732 | |
733 | === modified file 'src/maasserver/api/vlans.py' |
734 | === modified file 'src/maasserver/compose_preseed.py' |
735 | --- src/maasserver/compose_preseed.py 2017-03-29 21:13:51 +0000 |
736 | +++ src/maasserver/compose_preseed.py 2017-04-25 09:34:40 +0000 |
737 | @@ -270,12 +270,18 @@ |
738 | """Compose the preseed value for a node being installed with curtin.""" |
739 | metadata_url = absolute_reverse('curtin-metadata', base_url=base_url) |
740 | return _compose_cloud_init_preseed( |
741 | - node, token, metadata_url, base_url=base_url) |
742 | + node, token, metadata_url, base_url=base_url, reboot=True) |
743 | |
744 | |
745 | def _compose_cloud_init_preseed( |
746 | +<<<<<<< TREE |
747 | node, token, metadata_url, base_url, poweroff_timeout=3600, |
748 | reboot_timeout=1800): |
749 | +======= |
750 | + node, token, metadata_url, base_url, poweroff=False, |
751 | + poweroff_timeout=3600, poweroff_condition=None, |
752 | + reboot=False, reboot_timeout=1800): |
753 | +>>>>>>> MERGE-SOURCE |
754 | cloud_config = { |
755 | 'datasource': { |
756 | 'MAAS': { |
757 | @@ -318,6 +324,7 @@ |
758 | cloud_config['apt_proxy'] = apt_proxy |
759 | # Add APT configuration for new cloud-init (>= 0.7.7-17) |
760 | cloud_config.update(get_archive_config(node=node, preserve_sources=False)) |
761 | +<<<<<<< TREE |
762 | |
763 | enable_ssh = (node.status in { |
764 | NODE_STATUS.COMMISSIONING, |
765 | @@ -344,6 +351,23 @@ |
766 | 'condition': 'test ! -e /tmp/block-poweroff', |
767 | } |
768 | |
769 | +======= |
770 | + if poweroff: |
771 | + cloud_config['power_state'] = { |
772 | + 'delay': 'now', |
773 | + 'mode': 'poweroff', |
774 | + 'timeout': poweroff_timeout, |
775 | + } |
776 | + if poweroff_condition is not None: |
777 | + cloud_config['power_state']['condition'] = poweroff_condition |
778 | + if reboot: |
779 | + cloud_config['power_state'] = { |
780 | + 'delay': 'now', |
781 | + 'mode': 'reboot', |
782 | + 'timeout': reboot_timeout, |
783 | + 'condition': 'test ! -e /tmp/block-reboot' |
784 | + } |
785 | +>>>>>>> MERGE-SOURCE |
786 | return "#cloud-config\n%s" % yaml.safe_dump(cloud_config) |
787 | |
788 | |
789 | |
790 | === modified file 'src/maasserver/config.py' |
791 | --- src/maasserver/config.py 2017-03-30 19:40:18 +0000 |
792 | +++ src/maasserver/config.py 2017-04-25 09:34:40 +0000 |
793 | @@ -7,7 +7,13 @@ |
794 | "RegionConfiguration", |
795 | ] |
796 | |
797 | -from formencode.validators import Int |
798 | +<<<<<<< TREE |
799 | +from formencode.validators import Int |
800 | +======= |
801 | +from os import path |
802 | + |
803 | +from formencode.validators import Int |
804 | +>>>>>>> MERGE-SOURCE |
805 | from provisioningserver.config import ( |
806 | Configuration, |
807 | ConfigurationFile, |
808 | |
809 | === modified file 'src/maasserver/djangosettings/settings.py' |
810 | === modified file 'src/maasserver/fields.py' |
811 | === modified file 'src/maasserver/forms/tests/test_commissioning.py' |
812 | === modified file 'src/maasserver/forms/tests/test_dnsresource.py' |
813 | === modified file 'src/maasserver/forms/tests/test_interface_link.py' |
814 | --- src/maasserver/forms/tests/test_interface_link.py 2017-02-17 14:23:04 +0000 |
815 | +++ src/maasserver/forms/tests/test_interface_link.py 2017-04-25 09:34:40 +0000 |
816 | @@ -44,7 +44,12 @@ |
817 | }) |
818 | self.assertTrue(form.is_valid(), form.errors) |
819 | |
820 | - def test__sets_subnet_queryset_to_all_on_interface_wihtout_vlan(self): |
821 | +<<<<<<< TREE |
822 | + def test__sets_subnet_queryset_to_all_on_interface_wihtout_vlan(self): |
823 | +======= |
824 | + @transactional |
825 | + def test__sets_subnet_queryset_to_all_on_interface_wihtout_vlan(self): |
826 | +>>>>>>> MERGE-SOURCE |
827 | interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL) |
828 | interface.vlan = None |
829 | interface.save() |
830 | |
831 | === modified file 'src/maasserver/listener.py' |
832 | === renamed file 'src/maasserver/migrations/south/django16_south_maas19.tar.gz' => 'src/maasserver/migrations/south/django16_south_maas19.tar.gz.OTHER' |
833 | Binary files src/maasserver/migrations/south/django16_south_maas19.tar.gz 2016-12-07 12:46:14 +0000 and src/maasserver/migrations/south/django16_south_maas19.tar.gz.OTHER 2017-04-25 09:34:40 +0000 differ |
834 | === modified file 'src/maasserver/models/bmc.py' |
835 | === modified file 'src/maasserver/models/interface.py' |
836 | === modified file 'src/maasserver/models/node.py' |
837 | === modified file 'src/maasserver/models/staticipaddress.py' |
838 | --- src/maasserver/models/staticipaddress.py 2017-04-06 18:19:08 +0000 |
839 | +++ src/maasserver/models/staticipaddress.py 2017-04-25 09:34:40 +0000 |
840 | @@ -246,6 +246,7 @@ |
841 | requested_address = IPAddress(requested_address) |
842 | subnet.validate_static_ip(requested_address) |
843 | return self._attempt_allocation( |
844 | +<<<<<<< TREE |
845 | requested_address, alloc_type, user=user, subnet=subnet) |
846 | |
847 | def _get_special_mappings(self, domain, raw_ttl=False): |
848 | @@ -426,6 +427,165 @@ |
849 | mapping[fqdn].ttl = ttl |
850 | mapping[fqdn].ips.add(ip) |
851 | return mapping |
852 | +======= |
853 | + requested_address, alloc_type, |
854 | + user=user, subnet=subnet) |
855 | + |
856 | + def _get_special_mappings(self, domain, raw_ttl=False): |
857 | + """Get the special mappings, possibly limited to a single Domain. |
858 | + |
859 | + This function is responsible for creating these mappings: |
860 | + - any USER_RESERVED IP, |
861 | + - any IP not associated with a Node, |
862 | + - any IP associated with a DNSResource. |
863 | + The caller is responsible for addresses otherwise derived from nodes. |
864 | + |
865 | + Because of how the get hostname_ip_mapping code works, we actually need |
866 | + to fetch ALL of the entries for subnets, but forward mappings need to |
867 | + be domain-specific. |
868 | + |
869 | + :param domain: limit return to just the given Domain. If anything |
870 | + other than a Domain is passed in (e.g., a Subnet or None), we |
871 | + return all of the reverse mappings. |
872 | + :param raw_ttl: Boolean, if True then just return the address_ttl, |
873 | + otherwise, coalesce the address_ttl to be the correct answer for |
874 | + zone generation. |
875 | + :return: a (default) dict of hostname: HostnameIPMapping entries. |
876 | + """ |
877 | + default_ttl = "%d" % Config.objects.get_config('default_dns_ttl') |
878 | + if isinstance(domain, Domain): |
879 | + # Domains are special in that we only want to have entries for the |
880 | + # domain that we were asked about. And they can possibly come from |
881 | + # either the child or the parent for glue. |
882 | + where_clause = """ |
883 | + AND ( |
884 | + dnsrr.dom2_id = %s OR |
885 | + node.dom2_id = %s OR |
886 | + dnsrr.domain_id = %s OR |
887 | + node.domain_id = %s |
888 | + """ |
889 | + query_parms = [domain.id, domain.id, domain.id, domain.id] |
890 | + # And the default domain is extra special, since it needs to have |
891 | + # A/AAAA RRs for any USER_RESERVED addresses that have no name |
892 | + # otherwise attached to them. |
893 | + if domain.is_default(): |
894 | + where_clause += """ OR ( |
895 | + dnsrr.fqdn IS NULL AND |
896 | + node.fqdn IS NULL) |
897 | + """ |
898 | + where_clause += ")" |
899 | + else: |
900 | + # There is nothing special about the query for subnets. |
901 | + domain = None |
902 | + where_clause = "" |
903 | + query_parms = [] |
904 | + # raw_ttl says that we don't coalesce, but we need to pick one, so we |
905 | + # go with DNSResource if it is involved. |
906 | + if raw_ttl: |
907 | + ttl_clause = """COALESCE(dnsrr.address_ttl, node.address_ttl)""" |
908 | + else: |
909 | + ttl_clause = """ |
910 | + COALESCE( |
911 | + dnsrr.address_ttl, |
912 | + dnsrr.ttl, |
913 | + node.address_ttl, |
914 | + node.ttl, |
915 | + %s)""" % default_ttl |
916 | + # And here is the SQL query of doom. Build up inner selects to get the |
917 | + # view of a DNSResource (and Node) that we need, and finally use |
918 | + # domain2 to handle the case where an FQDN is also the name of a domain |
919 | + # that we know. |
920 | + sql_query = """ |
921 | + SELECT |
922 | + COALESCE(dnsrr.fqdn, node.fqdn) AS fqdn, |
923 | + node.system_id, |
924 | + node.node_type, |
925 | + """ + ttl_clause + """ AS ttl, |
926 | + staticip.ip |
927 | + FROM |
928 | + maasserver_staticipaddress AS staticip |
929 | + LEFT JOIN ( |
930 | + /* Create a dnsrr that has what we need. */ |
931 | + SELECT |
932 | + CASE WHEN dnsrr.name = '@' THEN |
933 | + dom.name |
934 | + ELSE |
935 | + CONCAT(dnsrr.name, '.', dom.name) |
936 | + END AS fqdn, |
937 | + dom.name as dom_name, |
938 | + dnsrr.domain_id, |
939 | + dnsrr.address_ttl, |
940 | + dom.ttl, |
941 | + dia.staticipaddress_id AS dnsrr_sip_id, |
942 | + dom2.id AS dom2_id |
943 | + FROM maasserver_dnsresource_ip_addresses AS dia |
944 | + JOIN maasserver_dnsresource AS dnsrr ON |
945 | + dia.dnsresource_id = dnsrr.id |
946 | + JOIN maasserver_domain AS dom ON |
947 | + dnsrr.domain_id = dom.id |
948 | + LEFT JOIN maasserver_domain AS dom2 ON |
949 | + CONCAT(dnsrr.name, '.', dom.name) = dom2.name OR ( |
950 | + dnsrr.name = '@' AND |
951 | + dom.name SIMILAR TO CONCAT('[-A-Za-z0-9]*.', dom2.name) |
952 | + ) |
953 | + ) AS dnsrr ON |
954 | + dnsrr_sip_id = staticip.id |
955 | + LEFT JOIN ( |
956 | + /* Create a node that has what we need. */ |
957 | + SELECT |
958 | + CONCAT(nd.hostname, '.', dom.name) AS fqdn, |
959 | + dom.name as dom_name, |
960 | + nd.system_id, |
961 | + nd.node_type, |
962 | + nd.domain_id, |
963 | + nd.address_ttl, |
964 | + dom.ttl, |
965 | + iia.staticipaddress_id AS node_sip_id, |
966 | + dom2.id AS dom2_id |
967 | + FROM maasserver_interface_ip_addresses AS iia |
968 | + JOIN maasserver_interface AS iface ON |
969 | + iia.interface_id = iface.id |
970 | + JOIN maasserver_node AS nd ON |
971 | + iface.node_id = nd.id |
972 | + JOIN maasserver_domain AS dom ON |
973 | + nd.domain_id = dom.id |
974 | + LEFT JOIN maasserver_domain AS dom2 ON |
975 | + CONCAT(nd.hostname, '.', dom.name) = dom2.name |
976 | + ) AS node ON |
977 | + node_sip_id = staticip.id |
978 | + WHERE |
979 | + staticip.ip IS NOT NULL AND |
980 | + host(staticip.ip) != '' AND |
981 | + ( |
982 | + staticip.alloc_type = %s OR |
983 | + node.fqdn IS NULL OR |
984 | + dnsrr IS NOT NULL |
985 | + )""" + where_clause + """ |
986 | + """ |
987 | + default_domain = Domain.objects.get_default_domain() |
988 | + mapping = defaultdict(HostnameIPMapping) |
989 | + cursor = connection.cursor() |
990 | + query_parms = [IPADDRESS_TYPE.USER_RESERVED] + query_parms |
991 | + cursor.execute(sql_query, query_parms) |
992 | + for (fqdn, system_id, node_type, ttl, |
993 | + ip) in cursor.fetchall(): |
994 | + if fqdn is None or fqdn == '': |
995 | + fqdn = "%s.%s" % ( |
996 | + get_ip_based_hostname(ip), default_domain.name) |
997 | + mapping[fqdn].node_type = node_type |
998 | + mapping[fqdn].system_id = system_id |
999 | + mapping[fqdn].ttl = ttl |
1000 | + mapping[fqdn].ips.add(ip) |
1001 | + return mapping |
1002 | + |
1003 | + @asynchronous |
1004 | + def _async_find_free_ip(self, *args, **kwargs): |
1005 | + return deferToDatabase( |
1006 | + transactional(self._find_free_ip), *args, **kwargs) |
1007 | + |
1008 | + def _find_free_ip(self, subnet, exclude_addresses=None): |
1009 | + return subnet.get_next_ip_for_allocation(exclude_addresses) |
1010 | +>>>>>>> MERGE-SOURCE |
1011 | |
1012 | def get_hostname_ip_mapping(self, domain_or_subnet, raw_ttl=False): |
1013 | """Return hostname mappings for `StaticIPAddress` entries. |
1014 | |
1015 | === modified file 'src/maasserver/models/subnet.py' |
1016 | === modified file 'src/maasserver/models/tests/test_bmc.py' |
1017 | === modified file 'src/maasserver/models/tests/test_interface.py' |
1018 | === modified file 'src/maasserver/models/tests/test_node.py' |
1019 | === modified file 'src/maasserver/models/tests/test_staticipaddress.py' |
1020 | --- src/maasserver/models/tests/test_staticipaddress.py 2017-04-06 16:38:44 +0000 |
1021 | +++ src/maasserver/models/tests/test_staticipaddress.py 2017-04-25 09:34:40 +0000 |
1022 | @@ -40,8 +40,12 @@ |
1023 | MAASServerTestCase, |
1024 | MAASTransactionServerTestCase, |
1025 | ) |
1026 | +<<<<<<< TREE |
1027 | from maasserver.utils import orm |
1028 | from maasserver.utils.dns import get_ip_based_hostname |
1029 | +======= |
1030 | +from maasserver.utils.dns import get_ip_based_hostname |
1031 | +>>>>>>> MERGE-SOURCE |
1032 | from maasserver.utils.orm import ( |
1033 | reload_object, |
1034 | transactional, |
1035 | @@ -1082,9 +1086,14 @@ |
1036 | self.expectThat(mappings, HasLength(0)) |
1037 | |
1038 | def test_user_reserved_addresses_included_in_correct_domains(self): |
1039 | +<<<<<<< TREE |
1040 | # Generate some addresses with no names attached, and some more in each |
1041 | # of two (non-default) domains. Make sure that they wind up in the |
1042 | # right domains, and not in other domains. |
1043 | +======= |
1044 | + # Generate addresses in two domains, and make sure that they wind up in |
1045 | + # the right domains, and not in other domains. |
1046 | +>>>>>>> MERGE-SOURCE |
1047 | domain0 = Domain.objects.get_default_domain() |
1048 | domain1 = factory.make_Domain() |
1049 | domain2 = factory.make_Domain() |
1050 | @@ -1277,6 +1286,138 @@ |
1051 | self.assertEqual({ |
1052 | dnsrr.fqdn: HostnameIPMapping(None, 30, {ip.ip}, None)}, mappings) |
1053 | |
1054 | + def test_dns_resources_only_have_correct_domain(self): |
1055 | + # Create two DNS resources pointing to the same IP, and make sure that |
1056 | + # they only get the forward mapping that they should have, but get both |
1057 | + # reverse mappings, as is proper. |
1058 | + domain0 = Domain.objects.get_default_domain() |
1059 | + domain1 = factory.make_Domain() |
1060 | + domain2 = factory.make_Domain() |
1061 | + subnet = factory.make_Subnet() |
1062 | + ip = factory.make_StaticIPAddress(subnet=subnet) |
1063 | + name1 = factory.make_name('label') |
1064 | + name2 = factory.make_name('label') |
1065 | + factory.make_DNSResource(name=name1, ip_addresses=[ip], domain=domain1) |
1066 | + factory.make_DNSResource(name=name2, ip_addresses=[ip], domain=domain2) |
1067 | + mappings = StaticIPAddress.objects.get_hostname_ip_mapping(domain0) |
1068 | + self.expectThat(mappings, HasLength(0)) |
1069 | + mappings = StaticIPAddress.objects.get_hostname_ip_mapping(domain1) |
1070 | + self.expectThat(mappings, HasLength(1)) |
1071 | + self.assertEqual( |
1072 | + mappings.get('%s.%s' % (name1, domain1.name)), |
1073 | + HostnameIPMapping(None, 30, {ip.ip}, None)) |
1074 | + mappings = StaticIPAddress.objects.get_hostname_ip_mapping(domain2) |
1075 | + self.expectThat(mappings, HasLength(1)) |
1076 | + self.assertEqual( |
1077 | + mappings.get('%s.%s' % (name2, domain2.name)), |
1078 | + HostnameIPMapping(None, 30, {ip.ip}, None)) |
1079 | + mappings = StaticIPAddress.objects.get_hostname_ip_mapping(subnet) |
1080 | + self.assertEqual( |
1081 | + mappings, { |
1082 | + "%s.%s" % (name1, domain1.name): HostnameIPMapping( |
1083 | + None, 30, {ip.ip}, None), |
1084 | + "%s.%s" % (name2, domain2.name): HostnameIPMapping( |
1085 | + None, 30, {ip.ip}, None)}) |
1086 | + |
1087 | + def test_user_reserved_IP_on_node_or_default_domain_not_both(self): |
1088 | + # ip1 gets assigned to an interface on a node in domain1 |
1089 | + # ip2 is not assigned to anything. |
1090 | + # ip1 should show up for the node, in domain1, and the subnet. |
1091 | + # ip2 should show up in the default domain, and the subnet. |
1092 | + domain0 = Domain.objects.get_default_domain() |
1093 | + domain1 = factory.make_Domain() |
1094 | + subnet = factory.make_Subnet() |
1095 | + ip1 = factory.make_StaticIPAddress(subnet=subnet) |
1096 | + ip2 = factory.make_StaticIPAddress(subnet=subnet) |
1097 | + name2 = "%s.%s" % (get_ip_based_hostname(ip2.ip), domain0.name) |
1098 | + node = factory.make_Node( |
1099 | + interface=True, |
1100 | + domain=domain1, |
1101 | + vlan=subnet.vlan) |
1102 | + node.interface_set.first().ip_addresses.add(ip1) |
1103 | + mappings = StaticIPAddress.objects.get_hostname_ip_mapping(domain0) |
1104 | + self.expectThat(mappings, HasLength(1)) |
1105 | + self.assertEqual( |
1106 | + mappings, { |
1107 | + name2: HostnameIPMapping(None, 30, {ip2.ip}, None)}) |
1108 | + mappings = StaticIPAddress.objects.get_hostname_ip_mapping(domain1) |
1109 | + self.expectThat(mappings, HasLength(1)) |
1110 | + self.assertEqual( |
1111 | + mappings.get(node.fqdn), |
1112 | + HostnameIPMapping(node.system_id, 30, {ip1.ip}, node.node_type)) |
1113 | + mappings = StaticIPAddress.objects.get_hostname_ip_mapping(subnet) |
1114 | + self.assertEqual( |
1115 | + mappings, { |
1116 | + node.fqdn: HostnameIPMapping( |
1117 | + node.system_id, 30, {ip1.ip}, node.node_type), |
1118 | + name2: HostnameIPMapping(None, 30, {ip2.ip}, None)}) |
1119 | + |
1120 | + def test_node_glue_correctly_generated(self): |
1121 | + # Given node "foo.bar.com" and a "foo.bar.com" domain (in addition to |
1122 | + # "bar.com"), with an IP associated with it, make sure that both |
1123 | + # domains are correctly populated. |
1124 | + domain0 = Domain.objects.get_default_domain() |
1125 | + parent = factory.make_Domain(name=factory.make_name('parent')) |
1126 | + name = factory.make_name('child') |
1127 | + domain = factory.make_Domain(name="%s.%s" % (name, parent.name)) |
1128 | + subnet = factory.make_Subnet() |
1129 | + ip = factory.make_StaticIPAddress(subnet=subnet) |
1130 | + node = factory.make_Node( |
1131 | + interface=True, |
1132 | + domain=parent, |
1133 | + hostname=name, |
1134 | + vlan=subnet.vlan) |
1135 | + node.interface_set.first().ip_addresses.add(ip) |
1136 | + mappings = StaticIPAddress.objects.get_hostname_ip_mapping(domain0) |
1137 | + self.expectThat(mappings, HasLength(0)) |
1138 | + mappings = StaticIPAddress.objects.get_hostname_ip_mapping(parent) |
1139 | + self.expectThat(mappings, HasLength(1)) |
1140 | + self.assertEqual( |
1141 | + mappings.get(node.fqdn), |
1142 | + HostnameIPMapping(node.system_id, 30, {ip.ip}, node.node_type)) |
1143 | + mappings = StaticIPAddress.objects.get_hostname_ip_mapping(domain) |
1144 | + self.expectThat(mappings, HasLength(1)) |
1145 | + self.assertEqual( |
1146 | + mappings.get(node.fqdn), |
1147 | + HostnameIPMapping(node.system_id, 30, {ip.ip}, node.node_type)) |
1148 | + mappings = StaticIPAddress.objects.get_hostname_ip_mapping(subnet) |
1149 | + self.assertEqual( |
1150 | + mappings, { |
1151 | + node.fqdn: HostnameIPMapping( |
1152 | + node.system_id, 30, {ip.ip}, node.node_type)}) |
1153 | + |
1154 | + def test_dnsrr_glue_correctly_generated(self): |
1155 | + # Given DNSResource "foo.bar.com" and a "foo.bar.com" domain (in |
1156 | + # addition to "bar.com"), with an IP associated with it, make sure that |
1157 | + # both domains are correctly populated. |
1158 | + domain0 = Domain.objects.get_default_domain() |
1159 | + parent = factory.make_Domain(name=factory.make_name('parent')) |
1160 | + name = factory.make_name('child') |
1161 | + domain = factory.make_Domain(name="%s.%s" % (name, parent.name)) |
1162 | + subnet = factory.make_Subnet() |
1163 | + ip = factory.make_StaticIPAddress(subnet=subnet) |
1164 | + dnsrr = factory.make_DNSResource( |
1165 | + domain=domain, |
1166 | + name='@', |
1167 | + ip_addresses=[ip]) |
1168 | + mappings = StaticIPAddress.objects.get_hostname_ip_mapping(domain0) |
1169 | + self.expectThat(mappings, HasLength(0)) |
1170 | + mappings = StaticIPAddress.objects.get_hostname_ip_mapping(parent) |
1171 | + self.expectThat(mappings, HasLength(1)) |
1172 | + self.assertEqual( |
1173 | + mappings.get(dnsrr.fqdn), |
1174 | + HostnameIPMapping(None, 30, {ip.ip}, None)) |
1175 | + mappings = StaticIPAddress.objects.get_hostname_ip_mapping(domain) |
1176 | + self.expectThat(mappings, HasLength(1)) |
1177 | + self.assertEqual( |
1178 | + mappings.get(dnsrr.fqdn), |
1179 | + HostnameIPMapping(None, 30, {ip.ip}, None)) |
1180 | + mappings = StaticIPAddress.objects.get_hostname_ip_mapping(subnet) |
1181 | + self.assertEqual( |
1182 | + mappings, { |
1183 | + dnsrr.fqdn: HostnameIPMapping( |
1184 | + None, 30, {ip.ip}, None)}) |
1185 | + |
1186 | |
1187 | class TestRenderJSON(MAASServerTestCase): |
1188 | |
1189 | |
1190 | === modified file 'src/maasserver/models/tests/test_subnet.py' |
1191 | --- src/maasserver/models/tests/test_subnet.py 2017-04-17 19:09:26 +0000 |
1192 | +++ src/maasserver/models/tests/test_subnet.py 2017-04-25 09:34:40 +0000 |
1193 | @@ -1012,6 +1012,7 @@ |
1194 | discovery = subnet.get_least_recently_seen_unknown_neighbour() |
1195 | self.assertThat(discovery.ip, Equals("10.0.0.2")) |
1196 | |
1197 | +<<<<<<< TREE |
1198 | def test__returns_least_recently_seen_neighbour_excludes_in_use(self): |
1199 | # Note: 10.0.0.0/30 --> 10.0.0.1 and 10.0.0.0.2 are usable. |
1200 | subnet = factory.make_Subnet( |
1201 | @@ -1051,6 +1052,25 @@ |
1202 | discovery = subnet.get_least_recently_seen_unknown_neighbour() |
1203 | self.assertThat(discovery.ip, Equals("10.0.0.2")) |
1204 | |
1205 | +======= |
1206 | + def test__returns_least_recently_seen_neighbour_excludes_in_use(self): |
1207 | + # Note: 10.0.0.0/30 --> 10.0.0.1 and 10.0.0.0.2 are usable. |
1208 | + subnet = factory.make_Subnet( |
1209 | + cidr="10.0.0.0/30", gateway_ip=None, dns_servers=None) |
1210 | + rackif = factory.make_Interface(vlan=subnet.vlan) |
1211 | + now = datetime.now() |
1212 | + yesterday = now - timedelta(days=1) |
1213 | + factory.make_Discovery( |
1214 | + ip="10.0.0.1", interface=rackif, updated=now) |
1215 | + factory.make_Discovery( |
1216 | + ip="10.0.0.2", interface=rackif, updated=yesterday) |
1217 | + factory.make_IPRange( |
1218 | + subnet, start_ip="10.0.0.2", end_ip="10.0.0.2", |
1219 | + type=IPRANGE_TYPE.RESERVED) |
1220 | + discovery = subnet.get_least_recently_seen_unknown_neighbour() |
1221 | + self.assertThat(discovery.ip, Equals("10.0.0.1")) |
1222 | + |
1223 | +>>>>>>> MERGE-SOURCE |
1224 | def test__returns_none_if_no_neighbours(self): |
1225 | # Note: 10.0.0.0/30 --> 10.0.0.1 and 10.0.0.0.2 are usable. |
1226 | subnet = factory.make_Subnet( |
1227 | |
1228 | === modified file 'src/maasserver/preseed.py' |
1229 | --- src/maasserver/preseed.py 2017-03-21 18:24:36 +0000 |
1230 | +++ src/maasserver/preseed.py 2017-04-25 09:34:40 +0000 |
1231 | @@ -471,6 +471,7 @@ |
1232 | get_node_preseed_context( |
1233 | node, osystem, series, rack_controller=rack_controller)) |
1234 | context.update(get_curtin_context(node, rack_controller=rack_controller)) |
1235 | +<<<<<<< TREE |
1236 | deprecated_context_variables = [ |
1237 | 'main_archive_hostname', 'main_archive_directory', |
1238 | 'ports_archive_hostname', 'ports_archive_directory', |
1239 | @@ -506,6 +507,43 @@ |
1240 | if node.distro_series == "precise": |
1241 | config['power_state'] = {'mode': 'reboot'} |
1242 | return yaml.safe_dump(config) |
1243 | +======= |
1244 | + deprecated_context_variables = [ |
1245 | + 'main_archive_hostname', 'main_archive_directory', |
1246 | + 'ports_archive_hostname', 'ports_archive_directory', |
1247 | + 'enable_http_proxy', 'http_proxy'] |
1248 | + deprecated_config_variables = [] |
1249 | + for var in deprecated_context_variables: |
1250 | + if var not in context: |
1251 | + deprecated_context_variables.remove(var) |
1252 | + context.update(get_node_deprecated_preseed_context()) |
1253 | + config = yaml.load(template.substitute(**context)) |
1254 | + # Remove deprecated config from the curtin preseed. |
1255 | + if 'power_state' in config: |
1256 | + del config['power_state'] |
1257 | + deprecated_config_variables.append('power_state') |
1258 | + if 'apt_proxy' in config: |
1259 | + deprecated_config_variables.append('apt_proxy') |
1260 | + del config['apt_proxy'] |
1261 | + if 'apt_mirrors' in config: |
1262 | + deprecated_config_variables.append('apt_mirrors') |
1263 | + del config['apt_mirrors'] |
1264 | + if deprecated_context_variables: |
1265 | + log.warn( |
1266 | + "WARNING: '%s' contains deprecated preseed " |
1267 | + "variables. Please remove: %s" % ( |
1268 | + template.name, ", ".join(deprecated_context_variables))) |
1269 | + if deprecated_config_variables: |
1270 | + log.warn( |
1271 | + "WARNING: '%s' contains deprecated preseed " |
1272 | + "configuration. Please remove: %s" % ( |
1273 | + template.name, ", ".join(deprecated_config_variables))) |
1274 | + # Precise does not support cloud-init performing the reboot, so curtin |
1275 | + # must have this statement. |
1276 | + if node.distro_series == "precise": |
1277 | + config['power_state'] = {'mode': 'reboot'} |
1278 | + return yaml.dump(config) |
1279 | +>>>>>>> MERGE-SOURCE |
1280 | |
1281 | |
1282 | def get_curtin_context(node, rack_controller=None): |
1283 | |
1284 | === modified file 'src/maasserver/rpc/regionservice.py' |
1285 | === modified file 'src/maasserver/rpc/tests/test_regionservice.py' |
1286 | === added file 'src/maasserver/static/assets/images/icons/account.svg.OTHER' |
1287 | --- src/maasserver/static/assets/images/icons/account.svg.OTHER 1970-01-01 00:00:00 +0000 |
1288 | +++ src/maasserver/static/assets/images/icons/account.svg.OTHER 2017-04-25 09:34:40 +0000 |
1289 | @@ -0,0 +1,1 @@ |
1290 | +<svg xmlns="http://www.w3.org/2000/svg" width="96" height="96" viewBox="0 0 96 96.000001"><g color="#000"><path overflow="visible" fill="none" d="M96 0v96H0V0z"/><path style="line-height:normal;font-variant-ligatures:none;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;block-progression:tb;shape-padding:0;isolation:auto;mix-blend-mode:normal" d="M48 6C24.828 6 6 24.83 6 48s18.828 41.998 42 41.998S90 71.17 90 48C90 24.83 71.172 6 48 6zm0 4c21.01 0 37.998 16.99 37.998 38 0 9.324-3.35 17.852-8.908 24.46a25.598 25.598 0 0 0-4.94-7.495c-1.955-2.062-4.308-3.79-7.017-5.192a24.975 24.975 0 0 1-3.697 2.682c3.188 1.365 5.775 3.117 7.81 5.264h.002c2.162 2.274 3.75 4.902 4.81 7.94C67.26 82.07 58.1 86 48 86c-10.135 0-19.325-3.96-26.133-10.412 1.123-3.013 2.706-5.623 4.78-7.875 2.208-2.328 5.055-4.2 8.626-5.606 3.507-1.38 7.732-2.106 12.696-2.11L48 60c2.886 0 5.613-.508 8.12-1.54l.017-.01.017-.01c2.49-1.078 4.66-2.615 6.45-4.575 1.84-1.96 3.258-4.302 4.242-6.967.994-2.693 1.476-5.672 1.476-8.898v-.002c0-3.18-.484-6.132-1.476-8.822-.98-2.706-2.397-5.073-4.24-7.037-1.79-1.966-3.973-3.483-6.47-4.515C53.623 16.54 50.89 16 48 16c-2.892 0-5.624.54-8.135 1.625a18.703 18.703 0 0 0-6.54 4.5l-.01.012-.01.01c-1.792 1.968-3.176 4.333-4.155 7.037l-.002.004c-.99 2.686-1.47 5.634-1.47 8.81 0 3.226.48 6.207 1.474 8.9.98 2.657 2.366 4.993 4.153 6.954l.01.01.01.01a19.447 19.447 0 0 0 4.152 3.345c-1.274.325-2.5.71-3.668 1.17-4.03 1.587-7.416 3.776-10.074 6.58l-.01.012-.01.01c-2.007 2.177-3.62 4.66-4.855 7.41a37.86 37.86 0 0 1-8.858-24.4c0-21.01 16.99-38 37.998-38zm0 9.998c2.408 0 4.573.438 6.562 1.3l.018.01.016.006c1.995.823 3.66 1.983 5.066 3.526l.01.012.01.01c1.453 1.548 2.587 3.42 3.406 5.685l.002.008.004.006c.81 2.195 1.226 4.662 1.226 7.44 0 2.83-.418 5.323-1.226 7.514-.818 2.216-1.953 4.07-3.412 5.623l-.01.01-.01.013c-1.408 1.546-3.083 2.735-5.086 3.606C52.584 55.583 50.412 56 48 56c-2.413 0-4.586-.416-6.578-1.234a15.41 15.41 0 0 1-5.168-3.62c-1.412-1.553-2.528-3.41-3.348-5.632-.808-2.19-1.226-4.684-1.226-7.514 0-2.778.417-5.245 1.226-7.44l.002-.005.004-.008c.82-2.27 1.936-4.147 3.342-5.693a14.599 14.599 0 0 1 5.15-3.54l.016-.007.017-.008c1.99-.864 4.156-1.302 6.563-1.302z" font-family="sans-serif" white-space="normal" overflow="visible" solid-color="#000000" fill="gray"/></g></svg> |
1291 | \ No newline at end of file |
1292 | |
1293 | === added file 'src/maasserver/static/assets/images/icons/add-logical-volume.svg.OTHER' |
1294 | --- src/maasserver/static/assets/images/icons/add-logical-volume.svg.OTHER 1970-01-01 00:00:00 +0000 |
1295 | +++ src/maasserver/static/assets/images/icons/add-logical-volume.svg.OTHER 2017-04-25 09:34:40 +0000 |
1296 | @@ -0,0 +1,1 @@ |
1297 | +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 4.2333398 4.2333403"><path color="#000" overflow="visible" opacity=".12" fill="none" d="M4.233 4.233V0H0v4.233z"/><path d="M3.175 2.38v.795H2.38v.265h.795v.793h.265V3.44h.793v-.265H3.44V2.38zM2.38 0v1.852h1.853V0zm.266.265H3.97v1.323H2.645zM0 0v1.852h1.852V0zm.265.265h1.323v1.323H.264zM0 2.38v1.853h1.852V2.38zm.265.266h1.323V3.97H.264z" color="#000" overflow="visible" fill="gray"/></svg> |
1298 | \ No newline at end of file |
1299 | |
1300 | === added file 'src/maasserver/static/assets/images/icons/add-partition.svg.OTHER' |
1301 | --- src/maasserver/static/assets/images/icons/add-partition.svg.OTHER 1970-01-01 00:00:00 +0000 |
1302 | +++ src/maasserver/static/assets/images/icons/add-partition.svg.OTHER 2017-04-25 09:34:40 +0000 |
1303 | @@ -0,0 +1,1 @@ |
1304 | +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 4.2333398 4.2333315"><path color="#000" overflow="visible" opacity=".12" fill="none" d="M4.233 4.233V0H0v4.233z"/><path d="M0 .794V3.44h1.852v-.265H.265V1.058h1.587V.794zm3.175.529v.794H2.38v.264h.795v.795h.265V2.38h.793v-.263H3.44v-.794zM1.852.264h.265v.53h-.265z" color="#000" overflow="visible" fill="gray"/><path color="#000" overflow="visible" fill="gray" d="M1.852 1.058h.265v.53h-.265zm0 .794h.265v.53h-.265zm0 .793h.265v.53h-.265zm0 .795h.265v.528h-.265z"/></svg> |
1305 | \ No newline at end of file |
1306 | |
1307 | === added file 'src/maasserver/static/assets/images/icons/add.svg.OTHER' |
1308 | --- src/maasserver/static/assets/images/icons/add.svg.OTHER 1970-01-01 00:00:00 +0000 |
1309 | +++ src/maasserver/static/assets/images/icons/add.svg.OTHER 2017-04-25 09:34:40 +0000 |
1310 | @@ -0,0 +1,1 @@ |
1311 | +<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><title>add</title><g fill="gray" fill-rule="evenodd"><path d="M20 9v2H0V9z"/><path d="M11 20H9V0h2z"/></g></svg> |
1312 | \ No newline at end of file |
1313 | |
1314 | === added file 'src/maasserver/static/assets/images/icons/cross-orange.svg.OTHER' |
1315 | --- src/maasserver/static/assets/images/icons/cross-orange.svg.OTHER 1970-01-01 00:00:00 +0000 |
1316 | +++ src/maasserver/static/assets/images/icons/cross-orange.svg.OTHER 2017-04-25 09:34:40 +0000 |
1317 | @@ -0,0 +1,1 @@ |
1318 | +<svg width="11" height="10" viewBox="0 0 11 10" xmlns="http://www.w3.org/2000/svg"><title>Imported Layers</title><path d="M2 1l8 8m0-8L2 9" stroke="#DD4814" stroke-width="3" stroke-linejoin="round" fill="none" fill-rule="evenodd"/></svg> |
1319 | \ No newline at end of file |
1320 | |
1321 | === added file 'src/maasserver/static/assets/images/icons/cross.svg.OTHER' |
1322 | --- src/maasserver/static/assets/images/icons/cross.svg.OTHER 1970-01-01 00:00:00 +0000 |
1323 | +++ src/maasserver/static/assets/images/icons/cross.svg.OTHER 2017-04-25 09:34:40 +0000 |
1324 | @@ -0,0 +1,1 @@ |
1325 | +<svg width="11" height="10" viewBox="0 0 11 10" xmlns="http://www.w3.org/2000/svg"><title>Imported Layers Copy</title><path d="M2 1l8 8m0-8L2 9" stroke="#888" stroke-width="3" stroke-linejoin="round" fill="none"/></svg> |
1326 | \ No newline at end of file |
1327 | |
1328 | === added file 'src/maasserver/static/assets/images/icons/cross_orange.svg.OTHER' |
1329 | --- src/maasserver/static/assets/images/icons/cross_orange.svg.OTHER 1970-01-01 00:00:00 +0000 |
1330 | +++ src/maasserver/static/assets/images/icons/cross_orange.svg.OTHER 2017-04-25 09:34:40 +0000 |
1331 | @@ -0,0 +1,1 @@ |
1332 | +<svg width="11" height="10" viewBox="0 0 11 10" xmlns="http://www.w3.org/2000/svg"><title>Imported Layers</title><path d="M2 1l8 8m0-8L2 9" stroke="#DD4814" stroke-width="3" stroke-linejoin="round" fill="none"/></svg> |
1333 | \ No newline at end of file |
1334 | |
1335 | === added file 'src/maasserver/static/assets/images/icons/debug.svg.OTHER' |
1336 | --- src/maasserver/static/assets/images/icons/debug.svg.OTHER 1970-01-01 00:00:00 +0000 |
1337 | +++ src/maasserver/static/assets/images/icons/debug.svg.OTHER 2017-04-25 09:34:40 +0000 |
1338 | @@ -0,0 +1,1 @@ |
1339 | +<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><title>debug icon 8@2x</title><path d="M11.673 12.994L14.68 16l1.313-1.316-3.004-3.005A5.501 5.501 0 0 0 8.5 3C5.46 3 3 5.463 3 8.5 3 11.54 5.46 14 8.5 14c1.18 0 2.276-.37 3.173-1.006zM4.25 8.5a4.25 4.25 0 1 1 8.5 0 4.25 4.25 0 0 1-8.5 0zM6 9h5v1H6V9zm0-2h5v1H6V7zM4.71 0C2.845 0 1.646.095.87.87.093 1.648 0 2.847 0 4.716v4.568c0 1.87.094 3.068.87 3.844.667.668 1.68.824 3.13.857v-1.002c-1.327-.044-2.075-.21-2.424-.56-.41-.41-.576-1.318-.576-3.14V4.716c0-1.82.167-2.727.576-3.137C1.986 1.168 2.892 1 4.71 1h4.577c1.82 0 2.726.17 3.135.578.348.35.514 1.097.558 2.422h1.006c-.033-1.45-.19-2.46-.857-3.13C12.352.096 11.153 0 9.286 0H4.71z" fill="gray" fill-rule="evenodd"/></svg> |
1340 | \ No newline at end of file |
1341 | |
1342 | === added file 'src/maasserver/static/assets/images/icons/delete.svg.OTHER' |
1343 | --- src/maasserver/static/assets/images/icons/delete.svg.OTHER 1970-01-01 00:00:00 +0000 |
1344 | +++ src/maasserver/static/assets/images/icons/delete.svg.OTHER 2017-04-25 09:34:40 +0000 |
1345 | @@ -0,0 +1,1 @@ |
1346 | +<svg width="19" height="24" viewBox="0 0 19 24" xmlns="http://www.w3.org/2000/svg"><title>remove</title><g fill="gray" fill-rule="evenodd"><path d="M1 5v15.898C1 24 2.067 24 4.733 24h9.534C16.933 24 18 24 18 20.9V5H1zm2 1.6h2V18h1V6.6h3V18h1V6.6h3V18h1V6.6h2v13.216C16 22 15.884 22 13.77 22H5.23C3.117 22 3 22 3 19.816V6.6z"/><path d="M0 5h19v2H0M7.014.547V2.74L8 2.395V1.2c.59-.12 1.004-.203 1.502-.2.498.003.917.086 1.498.2v1.195l1 .345V.547C10.872.072 10.46 0 9.507 0c-.954 0-1.42.087-2.493.547z"/><path d="M9.5 2C6.667 2 3.828 2.52 1 3.49V6h17V3.49C15.166 2.54 12.333 2 9.5 2z"/></g></svg> |
1347 | \ No newline at end of file |
1348 | |
1349 | === added file 'src/maasserver/static/assets/images/icons/edit.svg.OTHER' |
1350 | --- src/maasserver/static/assets/images/icons/edit.svg.OTHER 1970-01-01 00:00:00 +0000 |
1351 | +++ src/maasserver/static/assets/images/icons/edit.svg.OTHER 2017-04-25 09:34:40 +0000 |
1352 | @@ -0,0 +1,1 @@ |
1353 | +<svg width="22" height="22" viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg"><title>edit</title><g fill="gray" fill-rule="evenodd"><path d="M17 15h5v1h-5zm-3 3h8v1h-8zm-3 3h11v1H11zm5.75-21L3.47 13.517S.956 17.465 0 21.987v.004l.002.004V22c4.532-.955 8.48-3.472 8.48-3.472L22 5.25 16.75 0zM4.51 14.555L7.454 17.5c-.2.114-2.99 2.064-5.544 2.602V20.093l-.002-.003c.537-2.546 2.485-5.334 2.602-5.537v.002z"/><path d="M2.234 18l1.85 1.85L1 21"/></g></svg> |
1354 | \ No newline at end of file |
1355 | |
1356 | === added file 'src/maasserver/static/assets/images/icons/green-tick.svg.OTHER' |
1357 | --- src/maasserver/static/assets/images/icons/green-tick.svg.OTHER 1970-01-01 00:00:00 +0000 |
1358 | +++ src/maasserver/static/assets/images/icons/green-tick.svg.OTHER 2017-04-25 09:34:40 +0000 |
1359 | @@ -0,0 +1,1 @@ |
1360 | +<svg xmlns="http://www.w3.org/2000/svg" height="16" width="22" viewBox="0 0 22 16"><title>textfield-saved</title><path d="M20.04.343l-.154.136-11.138 9.756-6.53-5.601L.246 6.866l8.505 8.948L21.687 2.2 20.04.343z" fill="#38B44A" fill-rule="evenodd"/></svg> |
1361 | \ No newline at end of file |
1362 | |
1363 | === added file 'src/maasserver/static/assets/images/icons/help.svg.OTHER' |
1364 | --- src/maasserver/static/assets/images/icons/help.svg.OTHER 1970-01-01 00:00:00 +0000 |
1365 | +++ src/maasserver/static/assets/images/icons/help.svg.OTHER 2017-04-25 09:34:40 +0000 |
1366 | @@ -0,0 +1,1 @@ |
1367 | +<svg width="22" height="22" viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg"><title>help</title><g fill="none" fill-rule="evenodd"><path d="M0 0h22v22H0z"/><path d="M11.011 5.902c-.43 0-.843.056-1.237.166a5.314 5.314 0 0 0-1.238.499L7.91 4.849a6.271 6.271 0 0 1 1.55-.609A6.893 6.893 0 0 1 11.27 4c.74 0 1.349.105 1.829.314.48.197.862.45 1.145.757.283.308.48.646.59 1.016.112.37.167.726.167 1.07 0 .42-.08.795-.24 1.127-.148.333-.339.64-.573.924a9.395 9.395 0 0 1-.757.812c-.27.247-.523.505-.757.776-.234.258-.43.536-.59.831a2.199 2.199 0 0 0-.222.997v.222c0 .074.006.148.018.221H9.96a3.685 3.685 0 0 1-.056-.387 4.914 4.914 0 0 1-.018-.407c0-.406.067-.77.203-1.09.135-.32.307-.615.517-.886a7.9 7.9 0 0 1 .665-.757c.246-.234.474-.468.683-.702a3.91 3.91 0 0 0 .517-.72c.135-.246.203-.517.203-.812 0-.407-.141-.739-.425-.998-.27-.27-.683-.406-1.237-.406zM12.477 16.01c0 .43-.141.781-.424 1.052-.284.27-.634.406-1.053.406-.406 0-.757-.135-1.053-.406-.283-.271-.424-.622-.424-1.053 0-.43.141-.782.424-1.052A1.47 1.47 0 0 1 11 14.532c.419 0 .77.141 1.053.425.283.27.424.621.424 1.052z" fill="gray"/><circle stroke="gray" stroke-width="1.5" cx="11" cy="11" r="10.25"/></g></svg> |
1368 | \ No newline at end of file |
1369 | |
1370 | === added file 'src/maasserver/static/assets/images/icons/info-mono.svg.OTHER' |
1371 | --- src/maasserver/static/assets/images/icons/info-mono.svg.OTHER 1970-01-01 00:00:00 +0000 |
1372 | +++ src/maasserver/static/assets/images/icons/info-mono.svg.OTHER 2017-04-25 09:34:40 +0000 |
1373 | @@ -0,0 +1,1 @@ |
1374 | +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16.000017 16.000017"><g color="#000"><path style="marker:none" overflow="visible" fill="none" d="M0 0h16v16H0z"/><path style="marker:none" d="M1.066 0C.476 0 0 .475 0 1.066v13.868C0 15.524.475 16 1.066 16h13.868c.59 0 1.066-.475 1.066-1.066V1.066C16 .476 15.525 0 14.934 0H1.066zM7 3h2v2H7V3zm0 4h2v6H7V7z" overflow="visible" fill="#fff"/></g></svg> |
1375 | \ No newline at end of file |
1376 | |
1377 | === added file 'src/maasserver/static/assets/images/icons/info.svg.OTHER' |
1378 | --- src/maasserver/static/assets/images/icons/info.svg.OTHER 1970-01-01 00:00:00 +0000 |
1379 | +++ src/maasserver/static/assets/images/icons/info.svg.OTHER 2017-04-25 09:34:40 +0000 |
1380 | @@ -0,0 +1,1 @@ |
1381 | +<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><title>info</title><g fill="none" fill-rule="evenodd"><path d="M0 0h16v16H0z"/><g fill="#19B6EE"><path d="M8 0C3.6 0 0 3.6 0 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm0 14.5c-3.6 0-6.5-2.9-6.5-6.5S4.4 1.5 8 1.5s6.5 2.9 6.5 6.5-2.9 6.5-6.5 6.5z"/><path d="M7 10h2v2H7zM7 4h2v5H7z"/></g></g></svg> |
1382 | \ No newline at end of file |
1383 | |
1384 | === added file 'src/maasserver/static/assets/images/icons/logical-volume.svg.OTHER' |
1385 | --- src/maasserver/static/assets/images/icons/logical-volume.svg.OTHER 1970-01-01 00:00:00 +0000 |
1386 | +++ src/maasserver/static/assets/images/icons/logical-volume.svg.OTHER 2017-04-25 09:34:40 +0000 |
1387 | @@ -0,0 +1,1 @@ |
1388 | +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 4.2333398 4.2333403"><path style="marker:none" color="#000" overflow="visible" opacity=".12" fill="none" d="M4.233 4.233V0H0v4.233z"/><path style="marker:none" d="M3.175 2.381v.794h-.794v.265h.794v.793h.265V3.44h.793v-.265H3.44v-.794zM2.381 0v1.852h1.852V0zm.265.265h1.323v1.323H2.646zM0 0v1.852h1.852V0zm.265.265h1.323v1.323H.264zM0 2.381v1.852h1.852V2.381zm.265.265h1.323v1.323H.264z" color="#000" overflow="visible" fill="gray"/></svg> |
1389 | \ No newline at end of file |
1390 | |
1391 | === added file 'src/maasserver/static/assets/images/icons/magnifying_glass.svg.OTHER' |
1392 | --- src/maasserver/static/assets/images/icons/magnifying_glass.svg.OTHER 1970-01-01 00:00:00 +0000 |
1393 | +++ src/maasserver/static/assets/images/icons/magnifying_glass.svg.OTHER 2017-04-25 09:34:40 +0000 |
1394 | @@ -0,0 +1,1 @@ |
1395 | +<svg width="22" height="22" viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg"><title>magnifying_glass</title><g fill="none" fill-rule="evenodd"><path fill="gray" d="M16.655 14.67l-1.995 1.997L19.994 22l1.994-1.997z"/><ellipse stroke="gray" stroke-width="1.5" cx="9.5" cy="9.5" rx="8.708" ry="8.708"/></g></svg> |
1396 | \ No newline at end of file |
1397 | |
1398 | === added file 'src/maasserver/static/assets/images/icons/mount.svg.OTHER' |
1399 | --- src/maasserver/static/assets/images/icons/mount.svg.OTHER 1970-01-01 00:00:00 +0000 |
1400 | +++ src/maasserver/static/assets/images/icons/mount.svg.OTHER 2017-04-25 09:34:40 +0000 |
1401 | @@ -0,0 +1,1 @@ |
1402 | +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 4.2333493 4.2333317"><path style="marker:none" color="#000" overflow="visible" opacity=".12" fill="none" d="M4.233 4.233V0H0v4.233z"/><path d="M0 .265v.793h4.233V.265zm3.44.264h.529v.265h-.53zM3.175 2.117v.793h-.794v.265h.794v.794h.265v-.794h.793V2.91H3.44v-.793z" style="marker:none" color="#000" overflow="visible" fill="gray"/></svg> |
1403 | \ No newline at end of file |
1404 | |
1405 | === added file 'src/maasserver/static/assets/images/icons/partition.svg.OTHER' |
1406 | --- src/maasserver/static/assets/images/icons/partition.svg.OTHER 1970-01-01 00:00:00 +0000 |
1407 | +++ src/maasserver/static/assets/images/icons/partition.svg.OTHER 2017-04-25 09:34:40 +0000 |
1408 | @@ -0,0 +1,1 @@ |
1409 | +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 4.2333398 4.2333315"><path style="marker:none" color="#000" overflow="visible" opacity=".12" fill="none" d="M4.233 4.233V0H0v4.233z"/><path d="M0 .794V3.44h1.852v-.265H.265V1.058h1.587V.794zM3.175 1.323v.794h-.794v.264h.794v.794h.265v-.794h.793v-.264H3.44v-.794zM1.852.264h.265v.53h-.265z" style="marker:none" color="#000" overflow="visible" fill="gray"/><path style="marker:none" color="#000" overflow="visible" fill="gray" d="M1.852 1.058h.265v.53h-.265zM1.852 1.852h.265v.53h-.265zM1.852 2.645h.265v.53h-.265zM1.852 3.44h.265v.528h-.265z"/></svg> |
1410 | \ No newline at end of file |
1411 | |
1412 | === added file 'src/maasserver/static/assets/images/icons/power-error.svg.OTHER' |
1413 | --- src/maasserver/static/assets/images/icons/power-error.svg.OTHER 1970-01-01 00:00:00 +0000 |
1414 | +++ src/maasserver/static/assets/images/icons/power-error.svg.OTHER 2017-04-25 09:34:40 +0000 |
1415 | @@ -0,0 +1,1 @@ |
1416 | +<svg width="14" height="15" viewBox="0 0 14 15" xmlns="http://www.w3.org/2000/svg"><title>power-error</title><path d="M11.04 2.323l-.324 2.268a5.017 5.017 0 0 1 1.352 3.426c0 2.787-2.274 5.056-5.068 5.056-2.794 0-5.067-2.269-5.067-5.056a5.02 5.02 0 0 1 1.351-3.426L2.96 2.323A6.935 6.935 0 0 0 0 8.017C0 11.867 3.14 15 7 15s7-3.132 7-6.983c0-2.283-1.1-4.382-2.96-5.694zM6 0h2v7H6V0z" fill="#DB3832" fill-rule="evenodd"/></svg> |
1417 | \ No newline at end of file |
1418 | |
1419 | === added file 'src/maasserver/static/assets/images/icons/power-off.svg.OTHER' |
1420 | --- src/maasserver/static/assets/images/icons/power-off.svg.OTHER 1970-01-01 00:00:00 +0000 |
1421 | +++ src/maasserver/static/assets/images/icons/power-off.svg.OTHER 2017-04-25 09:34:40 +0000 |
1422 | @@ -0,0 +1,1 @@ |
1423 | +<svg width="14" height="15" viewBox="0 0 14 15" xmlns="http://www.w3.org/2000/svg"><title>power-off</title><path d="M11.04 2.323l-.324 2.268a5.017 5.017 0 0 1 1.352 3.426c0 2.787-2.274 5.056-5.068 5.056-2.794 0-5.067-2.269-5.067-5.056a5.02 5.02 0 0 1 1.351-3.426L2.96 2.323A6.935 6.935 0 0 0 0 8.017C0 11.867 3.14 15 7 15s7-3.132 7-6.983c0-2.283-1.1-4.382-2.96-5.694zM6 0h2v7H6V0z" fill="#D2D2D2" fill-rule="evenodd"/></svg> |
1424 | \ No newline at end of file |
1425 | |
1426 | === added file 'src/maasserver/static/assets/images/icons/power-on.svg.OTHER' |
1427 | --- src/maasserver/static/assets/images/icons/power-on.svg.OTHER 1970-01-01 00:00:00 +0000 |
1428 | +++ src/maasserver/static/assets/images/icons/power-on.svg.OTHER 2017-04-25 09:34:40 +0000 |
1429 | @@ -0,0 +1,1 @@ |
1430 | +<svg width="14" height="15" viewBox="0 0 14 15" xmlns="http://www.w3.org/2000/svg"><title>power-on</title><path d="M11.04 2.323l-.324 2.268a5.017 5.017 0 0 1 1.352 3.426c0 2.787-2.274 5.056-5.068 5.056-2.794 0-5.067-2.269-5.067-5.056a5.02 5.02 0 0 1 1.351-3.426L2.96 2.323A6.935 6.935 0 0 0 0 8.017C0 11.867 3.14 15 7 15s7-3.132 7-6.983c0-2.283-1.1-4.382-2.96-5.694zM6 0h2v7H6V0z" fill="#38B44A" fill-rule="evenodd"/></svg> |
1431 | \ No newline at end of file |
1432 | |
1433 | === added file 'src/maasserver/static/assets/images/icons/remove.svg.OTHER' |
1434 | --- src/maasserver/static/assets/images/icons/remove.svg.OTHER 1970-01-01 00:00:00 +0000 |
1435 | +++ src/maasserver/static/assets/images/icons/remove.svg.OTHER 2017-04-25 09:34:40 +0000 |
1436 | @@ -0,0 +1,1 @@ |
1437 | +<svg width="18" height="18" viewBox="0 0 18 18" xmlns="http://www.w3.org/2000/svg"><title>remove</title><g fill="gray" fill-rule="evenodd"><path d="M16.36 0L18 1.64 1.64 18 0 16.36z"/><path d="M18 16.36L16.36 18 0 1.64 1.64 0z"/></g></svg> |
1438 | \ No newline at end of file |
1439 | |
1440 | === added file 'src/maasserver/static/assets/images/icons/settings.svg.OTHER' |
1441 | --- src/maasserver/static/assets/images/icons/settings.svg.OTHER 1970-01-01 00:00:00 +0000 |
1442 | +++ src/maasserver/static/assets/images/icons/settings.svg.OTHER 2017-04-25 09:34:40 +0000 |
1443 | @@ -0,0 +1,1 @@ |
1444 | +<svg xmlns="http://www.w3.org/2000/svg" width="96" height="96" viewBox="0 0 96 96.000001"><g color="#000"><path style="marker:none" overflow="visible" fill="none" d="M96 0v96H0V0z"/><path style="line-height:normal;font-variant-ligatures:none;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;block-progression:tb;shape-padding:0;isolation:auto;mix-blend-mode:normal;marker:none" d="M79.197 66.033c9.916-17.191 3.984-39.246-13.223-49.19-17.207-9.944-39.253-4.057-49.17 13.134C6.89 47.168 12.82 69.222 30.027 79.166c17.207 9.944 39.255 4.058 49.17-13.133zm-3.465-2.002c-8.834 15.316-28.37 20.535-43.708 11.67-15.338-8.863-20.59-28.407-11.756-43.723 8.834-15.316 28.37-20.535 43.708-11.671 15.338 8.864 20.59 28.408 11.756 43.724z" font-weight="400" font-family="sans-serif" white-space="normal" overflow="visible" fill="gray"/><path style="marker:none" d="M54.902 5.582L41.098 7.645v7.097a34.033 33.971 43.146 0 1 13.804.028V5.582zm-28.246 6.244L16.14 20.768l5.181 6.175a34.033 33.971 43.146 0 1 10.58-8.867l-5.244-6.25zm42.631.067L64.08 18.1a34.033 33.971 43.146 0 1 .895.474 34.033 33.971 43.146 0 1 9.673 8.406l5.272-6.28-10.633-8.807zM8.398 34.008l-2.31 13.611 7.947 1.402a34.033 33.971 43.146 0 1 2.387-13.597l-8.024-1.416zm79.118.015l-7.987 1.409a34.033 33.971 43.146 0 1 2.432 13.588L90 47.604l-2.484-13.58zM15.758 58.645L8.67 62.738h-.002l6.98 11.91 7.018-4.05a34.033 33.971 43.146 0 1-6.908-11.953zm64.512.015a34.033 33.971 43.146 0 1-2.805 6.371 34.033 33.971 43.146 0 1-4.059 5.608l7.022 4.054 6.826-12-6.984-4.033zM30.148 76.867l-2.804 7.703 13.004 4.639 2.757-7.58a34.033 33.971 43.146 0 1-12.08-4.195 34.033 33.971 43.146 0 1-.877-.567zm35.733.08a34.033 33.971 43.146 0 1-12.979 4.707l2.782 7.639 12.941-4.807-2.744-7.539z" overflow="visible" fill="gray"/><path style="line-height:normal;font-variant-ligatures:none;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;block-progression:tb;shape-padding:0;isolation:auto;mix-blend-mode:normal;marker:none" d="M68.805 60.027c6.61-11.46 2.652-26.178-8.816-32.806-11.47-6.628-26.185-2.7-32.795 8.76-6.61 11.459-2.651 26.18 8.817 32.808 11.47 6.628 26.184 2.697 32.794-8.762zm-3.463-2.001C59.814 67.61 47.61 70.87 38.01 65.324c-9.6-5.548-12.88-17.757-7.351-27.341 5.528-9.585 17.732-12.846 27.332-7.298 9.6 5.547 12.88 17.757 7.351 27.34z" font-weight="400" font-family="sans-serif" white-space="normal" overflow="visible" fill="gray"/></g></svg> |
1445 | \ No newline at end of file |
1446 | |
1447 | === added file 'src/maasserver/static/assets/images/icons/success-mono.svg.OTHER' |
1448 | --- src/maasserver/static/assets/images/icons/success-mono.svg.OTHER 1970-01-01 00:00:00 +0000 |
1449 | +++ src/maasserver/static/assets/images/icons/success-mono.svg.OTHER 2017-04-25 09:34:40 +0000 |
1450 | @@ -0,0 +1,1 @@ |
1451 | +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16.000017 16.000017"><g color="#000"><path style="marker:none" overflow="visible" fill="none" d="M0 0h16v16H0z"/><path style="marker:none" d="M8 0C3.59 0 0 3.59 0 8s3.59 8 8 8 8-3.59 8-8-3.59-8-8-8zm3.8 4.924l.7.789L7 11.5 3.385 7.697l.84-.949L7 9.128l4.734-4.148.067-.056z" overflow="visible" fill="#fff"/></g></svg> |
1452 | \ No newline at end of file |
1453 | |
1454 | === added file 'src/maasserver/static/assets/images/icons/success.svg.OTHER' |
1455 | --- src/maasserver/static/assets/images/icons/success.svg.OTHER 1970-01-01 00:00:00 +0000 |
1456 | +++ src/maasserver/static/assets/images/icons/success.svg.OTHER 2017-04-25 09:34:40 +0000 |
1457 | @@ -0,0 +1,1 @@ |
1458 | +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16.000017 16.000017"><g transform="translate(-952 -156.362)"><path style="marker:none" color="#000" overflow="visible" fill="none" d="M952 156.362h16v16h-16z"/><circle r="7.25" cy="164.362" cx="960" style="marker:none" color="#000" overflow="visible" fill="#3eb34f" stroke="#3eb34f" stroke-width="1.5" stroke-dashoffset=".8"/><path style="line-height:125%;-inkscape-font-specification:Ubuntu;text-align:center" d="M963.8 161.286l-.066.057-4.734 4.148-2.776-2.381-.839.948 3.615 3.804 5.5-5.787-.7-.79z" font-weight="400" font-size="15" font-family="Ubuntu" letter-spacing="0" word-spacing="0" text-anchor="middle" fill="#fff"/></g></svg> |
1459 | \ No newline at end of file |
1460 | |
1461 | === added file 'src/maasserver/static/assets/images/icons/success_colour_black.svg.OTHER' |
1462 | --- src/maasserver/static/assets/images/icons/success_colour_black.svg.OTHER 1970-01-01 00:00:00 +0000 |
1463 | +++ src/maasserver/static/assets/images/icons/success_colour_black.svg.OTHER 2017-04-25 09:34:40 +0000 |
1464 | @@ -0,0 +1,1 @@ |
1465 | +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16.000017 16.000017"><g transform="translate(-952 -156.362)"><path style="marker:none" color="#000" overflow="visible" fill="none" d="M952 156.362h16v16h-16z"/><circle r="7.25" cy="164.362" cx="960" style="marker:none" color="#000" overflow="visible" fill="#3eb34f" stroke="#3eb34f" stroke-width="1.5" stroke-dashoffset=".8"/><path style="line-height:125%;-inkscape-font-specification:Ubuntu;text-align:center" d="M963.8 161.286l-.066.057-4.734 4.148-2.776-2.381-.839.948 3.615 3.804 5.5-5.787-.7-.79z" font-weight="400" font-size="15" font-family="Ubuntu" letter-spacing="0" word-spacing="0" text-anchor="middle"/></g></svg> |
1466 | \ No newline at end of file |
1467 | |
1468 | === added file 'src/maasserver/static/assets/images/icons/success_colour_white.svg.OTHER' |
1469 | --- src/maasserver/static/assets/images/icons/success_colour_white.svg.OTHER 1970-01-01 00:00:00 +0000 |
1470 | +++ src/maasserver/static/assets/images/icons/success_colour_white.svg.OTHER 2017-04-25 09:34:40 +0000 |
1471 | @@ -0,0 +1,1 @@ |
1472 | +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16.000017 16.000017"><g transform="translate(-952 -156.362)"><path style="marker:none" color="#000" overflow="visible" fill="none" d="M952 156.362h16v16h-16z"/><circle r="7.25" cy="164.362" cx="960" style="marker:none" color="#000" overflow="visible" fill="#3eb34f" stroke="#3eb34f" stroke-width="1.5" stroke-dashoffset=".8"/><path style="line-height:125%;-inkscape-font-specification:Ubuntu;text-align:center" d="M963.8 161.286l-.066.057-4.734 4.148-2.776-2.381-.839.948 3.615 3.804 5.5-5.787-.7-.79z" font-weight="400" font-size="15" font-family="Ubuntu" letter-spacing="0" word-spacing="0" text-anchor="middle" fill="#fff"/></g></svg> |
1473 | \ No newline at end of file |
1474 | |
1475 | === added file 'src/maasserver/static/assets/images/icons/success_mono.svg.OTHER' |
1476 | --- src/maasserver/static/assets/images/icons/success_mono.svg.OTHER 1970-01-01 00:00:00 +0000 |
1477 | +++ src/maasserver/static/assets/images/icons/success_mono.svg.OTHER 2017-04-25 09:34:40 +0000 |
1478 | @@ -0,0 +1,1 @@ |
1479 | +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16.000017 16.000017"><g color="#000"><path style="marker:none" overflow="visible" fill="none" d="M0 0h16v16H0z"/><path style="marker:none" d="M8 0C3.59 0 0 3.59 0 8s3.59 8 8 8 8-3.59 8-8-3.59-8-8-8zm3.8 4.924l.7.789L7 11.5 3.385 7.697l.84-.949L7 9.128l4.734-4.148.067-.056z" overflow="visible" fill="#fff"/></g></svg> |
1480 | \ No newline at end of file |
1481 | |
1482 | === added file 'src/maasserver/static/assets/images/icons/sync.svg.OTHER' |
1483 | --- src/maasserver/static/assets/images/icons/sync.svg.OTHER 1970-01-01 00:00:00 +0000 |
1484 | +++ src/maasserver/static/assets/images/icons/sync.svg.OTHER 2017-04-25 09:34:40 +0000 |
1485 | @@ -0,0 +1,1 @@ |
1486 | +<svg xmlns="http://www.w3.org/2000/svg" width="96" height="96" viewBox="0 0 96 96.000001"><g color="#000"><path style="marker:none" overflow="visible" fill="none" d="M96 0v96H0V0z"/><path d="M84.93 14.958L67.965 31.934a177.473 177.473 0 0 0 11.842 3.925A211.649 211.649 0 0 0 92 39c-.936-3.985-1.999-8.035-3.187-12.147a206.82 206.82 0 0 0-3.882-11.894zM11.035 81L28 64.024A177.472 177.472 0 0 0 16.158 60.1a211.647 211.647 0 0 0-12.193-3.141c.936 3.985 1.999 8.035 3.187 12.147 1.217 4.136 2.511 8.1 3.882 11.894z" style="marker:none" overflow="visible" fill="gray"/><path style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;shape-padding:0;isolation:auto;mix-blend-mode:normal;marker:none" d="M48 8C25.932 8 8 25.932 8 48c0 .652.02 1.3.05 1.945 1.356.336 2.717.686 4.083 1.053A36.54 36.54 0 0 1 12 48c0-19.906 16.094-36 36-36 13.005 0 24.38 6.872 30.705 17.186l2.86-2.862C74.444 15.31 62.076 8 48 8zm35.863 36.969c.084 1 .137 2.009.137 3.031 0 19.906-16.094 36-36 36-13.025 0-24.416-6.892-30.736-17.232l-2.88 2.88C21.512 80.682 33.908 88 48 88c22.068 0 40-17.932 40-40a2 2 0 0 0-.041-.406 40.381 40.381 0 0 0-.057-1.584 211.753 211.753 0 0 1-4.039-1.041z" font-weight="400" font-family="sans-serif" white-space="normal" overflow="visible" fill="gray"/></g></svg> |
1487 | \ No newline at end of file |
1488 | |
1489 | === added file 'src/maasserver/static/assets/images/icons/system-shutdown.svg.OTHER' |
1490 | --- src/maasserver/static/assets/images/icons/system-shutdown.svg.OTHER 1970-01-01 00:00:00 +0000 |
1491 | +++ src/maasserver/static/assets/images/icons/system-shutdown.svg.OTHER 2017-04-25 09:34:40 +0000 |
1492 | @@ -0,0 +1,1 @@ |
1493 | +<svg xmlns="http://www.w3.org/2000/svg" width="96" height="96" viewBox="0 0 96 96.000001"><g color="#000"><path style="marker:none" overflow="visible" fill="none" d="M96 0v96H0V0z"/><path d="M46 6l4-1v35h-4z" style="marker:none" overflow="visible" fill="gray"/><path style="line-height:normal;font-variant-ligatures:none;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;block-progression:tb;shape-padding:0;isolation:auto;mix-blend-mode:normal;marker:none" d="M30.006 16.798c-14.099 8.144-20.983 24.771-16.77 40.504C17.45 73.034 31.72 83.989 48 83.989s30.55-10.955 34.763-26.687c4.214-15.733-2.669-32.36-16.767-40.504l-2.002 3.463C76.54 27.509 82.65 42.263 78.9 56.266 75.15 70.27 62.488 79.99 48 79.99S20.85 70.27 17.1 56.266c-3.75-14.003 2.357-28.757 14.905-36.005l-2-3.463z" font-weight="400" font-family="sans-serif" white-space="normal" overflow="visible" fill="gray"/></g></svg> |
1494 | \ No newline at end of file |
1495 | |
1496 | === added file 'src/maasserver/static/assets/images/icons/tags.svg.OTHER' |
1497 | --- src/maasserver/static/assets/images/icons/tags.svg.OTHER 1970-01-01 00:00:00 +0000 |
1498 | +++ src/maasserver/static/assets/images/icons/tags.svg.OTHER 2017-04-25 09:34:40 +0000 |
1499 | @@ -0,0 +1,1 @@ |
1500 | +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 15.999999"><path opacity=".212" fill="none" d="M0 0h16v16H0z"/><path style="marker:none" d="M8.691 0L.775 7.918c-1.218 1.218-.913 1.522.305 2.74l2.13 2.131 2.132 2.13c1.218 1.219 1.522 1.524 2.74.306L16 7.309V.914c0-.304-.076-.533-.228-.686C15.619.076 15.39 0 15.086 0zm.418 1.008h5.883V6.89l-7.525 7.523c-.795.839-1.472-.388-2.074-.87a46.125 46.125 0 0 0-1.47-1.468 45.917 45.917 0 0 0-1.468-1.469c-.481-.602-1.708-1.28-.87-2.074L9.11 1.008z" color="#000" overflow="visible" fill="gray"/><path style="marker:none" d="M12.518 2.25a1.25 1.25 0 0 1 .867.365 1.25 1.25 0 0 1 0 1.77 1.25 1.25 0 0 1-1.77 0 1.25 1.25 0 0 1 0-1.77 1.25 1.25 0 0 1 .903-.365z" color="#000" overflow="visible" fill="gray"/></svg> |
1501 | \ No newline at end of file |
1502 | |
1503 | === added file 'src/maasserver/static/assets/images/icons/tick.svg.OTHER' |
1504 | --- src/maasserver/static/assets/images/icons/tick.svg.OTHER 1970-01-01 00:00:00 +0000 |
1505 | +++ src/maasserver/static/assets/images/icons/tick.svg.OTHER 2017-04-25 09:34:40 +0000 |
1506 | @@ -0,0 +1,1 @@ |
1507 | +<svg xmlns="http://www.w3.org/2000/svg" height="16" width="22" viewBox="0 0 22 16"><title>textfield-saved</title><path d="M20.04.343l-.154.136-11.138 9.756-6.53-5.601L.246 6.866l8.505 8.948L21.687 2.2 20.04.343z" fill="#38B44A" fill-rule="evenodd"/></svg> |
1508 | \ No newline at end of file |
1509 | |
1510 | === added file 'src/maasserver/static/assets/images/icons/tooltip.svg.OTHER' |
1511 | --- src/maasserver/static/assets/images/icons/tooltip.svg.OTHER 1970-01-01 00:00:00 +0000 |
1512 | +++ src/maasserver/static/assets/images/icons/tooltip.svg.OTHER 2017-04-25 09:34:40 +0000 |
1513 | @@ -0,0 +1,1 @@ |
1514 | +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 15.999999"><path style="marker:none" color="#000" overflow="visible" fill="none" d="M0 0h16v16H0z"/><path style="marker:none" d="M1.066 0C.476 0 0 .475 0 1.066v13.868C0 15.524.475 16 1.066 16h13.868c.59 0 1.066-.475 1.066-1.066V1.066C16 .476 15.525 0 14.934 0H1.066zM1 1h14v14H1V1z" color="#000" overflow="visible" fill="gray"/><path style="line-height:125%;-inkscape-font-specification:'Ubuntu Medium';text-align:center" d="M8.154 2.676c-.497 0-.985.064-1.463.193-.467.12-.884.283-1.252.492l.506 1.387a4.294 4.294 0 0 1 1-.402c.319-.09.652-.133 1-.133.448 0 .782.11 1 .328.229.209.342.476.342.805 0 .238-.055.457-.164.656-.11.199-.249.393-.418.582-.169.189-.352.377-.55.566a6.377 6.377 0 0 0-.538.612 3.22 3.22 0 0 0-.418.716c-.11.26-.164.553-.164.881 0 .1.006.21.016.328.01.11.023.214.043.313h1.552a1.09 1.09 0 0 1-.015-.18v-.177c0-.299.06-.568.18-.807a3.43 3.43 0 0 1 .476-.67c.19-.219.393-.428.611-.627.22-.209.423-.427.612-.656.189-.229.343-.478.463-.746.129-.269.195-.572.195-.91 0-.279-.045-.567-.135-.866a2.095 2.095 0 0 0-.478-.82c-.229-.249-.536-.452-.924-.611-.388-.17-.88-.254-1.477-.254zM8 11.006a.995.995 0 0 0-.713.287.942.942 0 0 0-.287.713c0 .292.095.53.287.713.2.183.438.275.713.275a.992.992 0 0 0 .713-.275.942.942 0 0 0 .287-.713.943.943 0 0 0-.287-.713.968.968 0 0 0-.713-.287z" font-weight="500" font-family="Ubuntu" letter-spacing="0" word-spacing="0" text-anchor="middle" fill="gray"/></svg> |
1515 | \ No newline at end of file |
1516 | |
1517 | === added file 'src/maasserver/static/assets/images/icons/unmount.svg.OTHER' |
1518 | --- src/maasserver/static/assets/images/icons/unmount.svg.OTHER 1970-01-01 00:00:00 +0000 |
1519 | +++ src/maasserver/static/assets/images/icons/unmount.svg.OTHER 2017-04-25 09:34:40 +0000 |
1520 | @@ -0,0 +1,1 @@ |
1521 | +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 4.2333493 4.2333317"><path style="marker:none" color="#000" overflow="visible" opacity=".12" fill="none" d="M4.233 4.233V0H0v4.233z"/><path d="M0 .265v.793h4.233V.265zm3.44.264h.529v.265h-.53zM2.381 2.91v.265h1.852V2.91z" style="marker:none" color="#000" overflow="visible" fill="gray"/></svg> |
1522 | \ No newline at end of file |
1523 | |
1524 | === added file 'src/maasserver/static/assets/images/icons/warning-mono.svg.OTHER' |
1525 | --- src/maasserver/static/assets/images/icons/warning-mono.svg.OTHER 1970-01-01 00:00:00 +0000 |
1526 | +++ src/maasserver/static/assets/images/icons/warning-mono.svg.OTHER 2017-04-25 09:34:40 +0000 |
1527 | @@ -0,0 +1,1 @@ |
1528 | +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16.000017 16.000017"><g color="#000"><path style="marker:none" overflow="visible" fill="none" d="M0 0h16v16H0z"/><path style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;shape-padding:0;isolation:auto;mix-blend-mode:normal;marker:none" d="M8.045-.023a.967 1.034 0 0 0-.098.002.967 1.034 0 0 0-.785.513L.154 13.471a.967 1.034 0 0 0 .836 1.552h14.02a.967 1.034 0 0 0 .836-1.552L8.838.492a.967 1.034 0 0 0-.793-.515zM7 5h2v5H7V5zm0 6h2v2H7v-2z" font-weight="400" font-family="sans-serif" white-space="normal" overflow="visible" fill="#fff"/></g></svg> |
1529 | \ No newline at end of file |
1530 | |
1531 | === added file 'src/maasserver/static/assets/images/icons/warning.svg.OTHER' |
1532 | --- src/maasserver/static/assets/images/icons/warning.svg.OTHER 1970-01-01 00:00:00 +0000 |
1533 | +++ src/maasserver/static/assets/images/icons/warning.svg.OTHER 2017-04-25 09:34:40 +0000 |
1534 | @@ -0,0 +1,1 @@ |
1535 | +<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><title>warning</title><g fill="none" fill-rule="evenodd"><path d="M0 0h16v16H0z"/><circle stroke="#F4B457" stroke-width="1.5" cx="8" cy="8" r="7.25"/><path d="M7 4v5h2V4H7zm0 6v2h2v-2H7z" fill="#F4B457"/></g></svg> |
1536 | \ No newline at end of file |
1537 | |
1538 | === added file 'src/maasserver/static/assets/images/icons/warning_colour_black.svg.OTHER' |
1539 | --- src/maasserver/static/assets/images/icons/warning_colour_black.svg.OTHER 1970-01-01 00:00:00 +0000 |
1540 | +++ src/maasserver/static/assets/images/icons/warning_colour_black.svg.OTHER 2017-04-25 09:34:40 +0000 |
1541 | @@ -0,0 +1,1 @@ |
1542 | +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16.000017 16.000017"><g color="#000"><path style="marker:none" overflow="visible" fill="none" d="M0 0h16v16H0z"/><path style="marker:none" d="M963.075 207.025h-6.15L960 201.7z" transform="matrix(2.27997 0 0 2.43698 -2180.772 -490.526)" overflow="visible" fill="#e95420" stroke="#e95420" stroke-width=".848" stroke-linejoin="round"/><path style="marker:none" d="M7 5v5h2V5H7zm0 6v2h2v-2H7z" overflow="visible"/></g></svg> |
1543 | \ No newline at end of file |
1544 | |
1545 | === added file 'src/maasserver/static/assets/images/icons/warning_colour_white.svg.OTHER' |
1546 | --- src/maasserver/static/assets/images/icons/warning_colour_white.svg.OTHER 1970-01-01 00:00:00 +0000 |
1547 | +++ src/maasserver/static/assets/images/icons/warning_colour_white.svg.OTHER 2017-04-25 09:34:40 +0000 |
1548 | @@ -0,0 +1,1 @@ |
1549 | +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16.000017 16.000017"><g color="#000"><path style="marker:none" overflow="visible" fill="none" d="M0 0h16v16H0z"/><path style="marker:none" d="M963.075 207.025h-6.15L960 201.7z" transform="matrix(2.27997 0 0 2.43698 -2180.772 -490.526)" overflow="visible" fill="#e95420" stroke="#e95420" stroke-width=".848" stroke-linejoin="round"/><path style="marker:none" overflow="visible" fill="#fff" d="M7 5h2v5H7zM7 11h2v2H7z"/></g></svg> |
1550 | \ No newline at end of file |
1551 | |
1552 | === added file 'src/maasserver/static/assets/images/icons/warning_mono.svg.OTHER' |
1553 | --- src/maasserver/static/assets/images/icons/warning_mono.svg.OTHER 1970-01-01 00:00:00 +0000 |
1554 | +++ src/maasserver/static/assets/images/icons/warning_mono.svg.OTHER 2017-04-25 09:34:40 +0000 |
1555 | @@ -0,0 +1,1 @@ |
1556 | +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16.000017 16.000017"><g color="#000"><path style="marker:none" overflow="visible" fill="none" d="M0 0h16v16H0z"/><path style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;shape-padding:0;isolation:auto;mix-blend-mode:normal;marker:none" d="M8.045-.023a.967 1.034 0 0 0-.098.002.967 1.034 0 0 0-.785.513L.154 13.471a.967 1.034 0 0 0 .836 1.552h14.02a.967 1.034 0 0 0 .836-1.552L8.838.492a.967 1.034 0 0 0-.793-.515zM7 5h2v5H7V5zm0 6h2v2H7v-2z" font-weight="400" font-family="sans-serif" white-space="normal" overflow="visible" fill="#fff"/></g></svg> |
1557 | \ No newline at end of file |
1558 | |
1559 | === added file 'src/maasserver/static/css/build.css' |
1560 | --- src/maasserver/static/css/build.css 1970-01-01 00:00:00 +0000 |
1561 | +++ src/maasserver/static/css/build.css 2017-04-25 09:34:40 +0000 |
1562 | @@ -0,0 +1,1 @@ |
1563 | +*{font-smoothing:subpixel-antialiased;box-sizing:border-box}button,input[type='button'],input[type='reset'],input[type='submit'],.button--primary,.button--secondary,.button--neutral,.button--inline-neutral,.button--positive,.button--inline-positive,.button--destructive,.button--inline-destructive,.button--base,.button--inline-base{font-smoothing:subpixel-antialiased;font-size:1em;display:inline-block;width:100%;margin:0;padding:11px 24px;text-align:center;text-decoration:none;border:0;border-radius:2px;outline:none;font-weight:300;cursor:pointer}button:hover,input[type='button']:hover,input[type='reset']:hover,input[type='submit']:hover,.button--primary:hover,.button--secondary:hover,.button--neutral:hover,.button--inline-neutral:hover,.button--positive:hover,.button--inline-positive:hover,.button--destructive:hover,.button--inline-destructive:hover,.button--base:hover,.button--inline-base:hover{text-decoration:none}@media only screen and (min-width: 768px){button,input[type='button'],input[type='reset'],input[type='submit'],.button--primary,.button--secondary,.button--neutral,.button--inline-neutral,.button--positive,.button--inline-positive,.button--destructive,.button--inline-destructive,.button--base,.button--inline-base{width:auto}}.clearfix{display:block}.clearfix:after{clear:both;content:'\0020';display:block;height:0;overflow:hidden;visibility:hidden}textarea,input[type='text'],input[type='number'],input[type='search'],input[type='password'],input[type='email'],input[type='url'],input[type='tel'],select{-webkit-appearance:textfield;border-radius:2px;border:1px solid #cdcdcd;box-shadow:inset 0 1px 2px rgba(0,0,0,0.12);font-size:16px;margin:0;outline:none;padding:.6956522em .869565em;vertical-align:baseline;font-weight:300}textarea:active,input[type='text']:active,input[type='number']:active,input[type='search']:active,input[type='password']:active,input[type='email']:active,input[type='url']:active,input[type='tel']:active,select:active,textarea:focus,input[type='text']:focus,input[type='number']:focus,input[type='search']:focus,input[type='password']:focus,input[type='email']:focus,input[type='url']:focus,input[type='tel']:focus,select:focus{border-color:#888;outline:none}textarea::placeholder,input[type='text']::placeholder,input[type='number']::placeholder,input[type='search']::placeholder,input[type='password']::placeholder,input[type='email']::placeholder,input[type='url']::placeholder,input[type='tel']::placeholder,select::placeholder{color:contrast-friendly-search-color(#f7f7f7)}textarea[disabled="disabled"],input[disabled="disabled"][type='text'],input[disabled="disabled"][type='number'],input[disabled="disabled"][type='search'],input[disabled="disabled"][type='password'],input[disabled="disabled"][type='email'],input[disabled="disabled"][type='url'],input[disabled="disabled"][type='tel'],select[disabled="disabled"]{opacity:.5}input[type='checkbox'],input[type='radio']{border-radius:2px;border:1px solid #cdcdcd;box-shadow:inset 0 1px 2px rgba(0,0,0,0.12);height:14px;padding:0;vertical-align:middle;width:14px}.inner-wrapper{margin:0 auto;max-width:1030px}[class*='-col'].last-col,[class*='-col'] [class*='-col'].last-col{margin-right:0}.one-col,.two-col,.three-col,.four-col,.five-col,.six-col,.seven-col,.eight-col,.nine-col,.ten-col,.eleven-col,.twelve-col{clear:none;margin-bottom:20px;margin-right:0;padding:0;display:inline-block;position:relative;width:100%}@media only screen and (min-width: 768px){.one-col,.two-col,.three-col,.four-col,.five-col,.six-col,.seven-col,.eight-col,.nine-col,.ten-col,.eleven-col,.twelve-col{float:left}}.list-ticks,.list{list-style:none;margin-left:0}.list-ticks li,.list li{border-bottom:1px dotted #888;margin-bottom:0;padding:10px 0}.list-ticks li:last-of-type,.list li:last-of-type,.list-ticks .last-item,.list .last-item{border:0;margin-bottom:0;padding-bottom:0}.list-ticks li{background-repeat:no-repeat;background-position:0 1em;padding-left:25px}.box{background:#fff;border:1px solid #cdcdcd;padding:1.25em 20px}@media only screen and (min-width: 768px){.equal-height,.equal-height--vertical-divider{display:flex;flex-wrap:wrap;flex-direction:row;width:100%}.equal-height .equal-height__item,.equal-height--vertical-divider .equal-height__item{display:flex;flex:auto;flex-direction:column}}button,input[type='button'],input[type='reset'],input[type='submit'],.button--primary,.button--secondary,.button--neutral,.button--inline-neutral,.button--positive,.button--inline-positive,.button--destructive,.button--inline-destructive,.button--base,.button--inline-base{font-size:1em;box-sizing:border-box;width:100%;margin:0;padding:11px 24px;text-align:center;text-decoration:none;border-radius:2px;outline:none;font-weight:300;cursor:pointer;line-height:1em}button:disabled,input[type='button']:disabled,input[type='reset']:disabled,input[type='submit']:disabled,.button--primary:disabled,.button--secondary:disabled,.button--neutral:disabled,.button--inline-neutral:disabled,.button--positive:disabled,.button--inline-positive:disabled,.button--destructive:disabled,.button--inline-destructive:disabled,.button--base:disabled,.button--inline-base:disabled,button.button--disabled,input.button--disabled[type='button'],input.button--disabled[type='reset'],input.button--disabled[type='submit'],.button--disabled.button--primary,.button--disabled.button--secondary,.button--disabled.button--neutral,.button--disabled.button--inline-neutral,.button--disabled.button--positive,.button--disabled.button--inline-positive,.button--disabled.button--destructive,.button--disabled.button--inline-destructive,.button--disabled.button--base,.button--disabled.button--inline-base{opacity:.5;cursor:default}button,input[type='button'],input[type='reset'],input[type='submit'],.button--primary,.button--secondary,.button--neutral,.button--inline-neutral,.button--positive,.button--inline-positive,.button--destructive,.button--inline-destructive,.button--base,.button--inline-base{line-height:20px;white-space:nowrap;vertical-align:middle;touch-action:manipulation;cursor:pointer;user-select:none;padding:8px 14px;height:36px;box-sizing:border-box}button[disabled],input[disabled][type='button'],input[disabled][type='reset'],input[disabled][type='submit'],[disabled].button--primary,[disabled].button--secondary,[disabled].button--neutral,[disabled].button--inline-neutral,[disabled].button--positive,[disabled].button--inline-positive,[disabled].button--destructive,[disabled].button--inline-destructive,[disabled].button--base,[disabled].button--inline-base,button.button--disabled,input.button--disabled[type='button'],input.button--disabled[type='reset'],input.button--disabled[type='submit'],.button--disabled.button--primary,.button--disabled.button--secondary,.button--disabled.button--neutral,.button--disabled.button--inline-neutral,.button--disabled.button--positive,.button--disabled.button--inline-positive,.button--disabled.button--destructive,.button--disabled.button--inline-destructive,.button--disabled.button--base,.button--disabled.button--inline-base{pointer-events:none;opacity:.5}button.button--inline,input.button--inline[type='button'],input.button--inline[type='reset'],input.button--inline[type='submit'],.button--inline.button--primary,.button--inline.button--secondary,.button--inline.button--neutral,.button--inline.button--inline-neutral,.button--inline.button--positive,.button--inline.button--inline-positive,.button--inline.button--destructive,.button--inline.button--inline-destructive,.button--inline.button--base,.button--inline.button--inline-base{display:inline-block;width:auto}html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,ol,ul,li,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,menu,nav,output,ruby,section,summary,time,mark,audio,video{border:0;margin:0;padding:0;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,nav,section{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none}[hidden]{display:none}html{font-size:100%;overflow-y:scroll;text-size-adjust:100%}blockquote,q{quotes:none}legend{border:0}figure{margin:0}abbr,acronym{cursor:help}.link-arrow:after{content:'\0000a0›'}nav ul li h2 a:after{content:'\0000a0›'}nav ul li a:after,.carousel ul li a:after,ul li p a:after{content:''}svg:not(:root){overflow:hidden}img{border:0;height:auto;max-width:100%}img .left{margin-right:20px}img .right{margin-left:20px}.middle img{vertical-align:middle;margin-top:4em}ins{background:#fffbeb;text-decoration:none}.left{float:left}.right{float:right}.no-border{border:0}.link-top{font-size:.875em;clear:both;margin-bottom:40px;margin-top:-40px}.link-top a{background:#fff;margin-right:10px;margin-top:-35px;padding:5px;float:right}.caps{text-transform:uppercase}.touch-border,.touch-bottom{float:left}@media only screen and (min-width: 768px){.touch-border,.touch-bottom{margin-bottom:-20px}}@media only screen and (min-width: 1440px){.touch-border,.touch-bottom{margin-bottom:-40px}}.accessibility-aid,.off-left{position:absolute;left:-999em}.external{background-size:.7em .7em;padding-right:.9em;background-image:url("https://assets.ubuntu.com/v1/f24a8aa0-external-link-orange.svg");background-position:100% top;background-repeat:no-repeat}.no-svg .external{background-image:url("https://assets.ubuntu.com/v1/f24a8aa0-external-link-orange.svg")}.text-center,.align-center{text-align:center}.no-margin-bottom{margin-bottom:0}.no-padding-bottom{padding-bottom:0}.pull-bottom-right{float:right;margin-right:-10px}@media only screen and (min-width: 768px){.pull-bottom-right{margin-right:-40px;margin-bottom:-40px}}@media only screen and (min-width: 1440px){.pull-bottom-right{margin-right:-40px;margin-bottom:-60px}}.pull-bottom-left{float:left;margin-left:-10px}@media only screen and (min-width: 768px){.pull-bottom-left{margin-left:-40px;margin-bottom:-40px}}@media only screen and (min-width: 1440px){.pull-bottom-left{margin-left:-40px;margin-bottom:-60px}}@media only screen and (max-width: 767px){.priority-0,.not-for-small{display:none}}@media only screen and (min-width: 768px){.for-mobile,.for-small{display:none}}.video-container{position:relative;padding-bottom:56.25%;padding-top:30px;height:0;overflow:hidden}.video-container iframe{position:absolute;top:0;left:0;width:100%;height:100%}.video-container+.video-title{margin-top:20px}.pull-right{float:right;margin-right:-40px}@media only screen and (max-width: 768px){.pull-right{margin-bottom:20px}}.pull-left{margin-left:-40px}.for-tablet,.for-medium{display:none}@media only screen and (min-width: 768px){.for-tablet,.for-medium{display:block}}@media only screen and (min-width: 768px) and (max-width: 1440px){.med-six-col .three-col{width:48.93617%}.med-six-col .three-col:nth-of-type(2n){margin-right:0}}blockquote{margin:0}blockquote>p{font-size:1em;margin:0 0 .4em}blockquote small{font-size:.8125em;line-height:1.4}.pull-quote{text-indent:0}.pull-quote p{font-size:1.5em;line-height:1.3;margin-left:.4em;padding-left:10px;padding-right:10px;text-indent:-.4em}.pull-quote p span{color:#f7f7f7;font-weight:bold;left:-5px;line-height:0;position:relative}.pull-quote p span:last-of-type{left:5px}.pull-quote p cite{display:block;font-size:.75em;font-weight:300;margin:10px 0 0;text-indent:0}@media only screen and (min-width: 768px){.pull-quote p{padding-left:0;padding-right:0;text-indent:-.7em}.pull-quote p span{top:5px;font-size:1.391304348em}.pull-quote p cite{margin-left:0;text-indent:0}}@media only screen and (min-width: 1440px){.pull-quote p span{top:10px}}.row-quote{border-radius:0}.row-quote blockquote{border-radius:4px;margin:0;padding:0}.row-quote blockquote p{color:#333;line-height:1.3;margin-bottom:.75em;padding-left:10px;padding-right:10px;text-indent:0}.row-quote blockquote span{color:#f7f7f7;font-weight:bold;left:-5px;line-height:0;position:relative}.row-quote blockquote span+span{left:5px}.row-quote blockquote cite{color:#333;font-size:.75em;font-style:normal;margin-bottom:0;text-indent:0}@media only screen and (min-width: 768px){.row-quote{text-indent:-.4em}.row-quote blockquote{text-indent:-7px}.row-quote blockquote p{font-size:1.5em;padding-left:0;padding-right:0;text-indent:-.4em}.row-quote blockquote span{top:5px;font-size:1.391304348em}.row-quote blockquote cite{margin-left:0;text-indent:0}}@media only screen and (min-width: 1440px){.row-quote blockquote{padding:0 80px 20px;text-indent:-10px}.row-quote blockquote p span{top:10px}}button,input[type='button'],input[type='reset'],input[type='submit'],.button--primary{color:#fff;background-color:#dd4814}button:hover,input[type='button']:hover,input[type='reset']:hover,input[type='submit']:hover,.button--primary:hover{background-color:#c03f11}.button--secondary{color:#dd4814;background-color:#fff;border:1px solid #cdcdcd}.button--secondary:hover{background-color:#efefef}@media only screen and (min-width: 620px){.nav-secondary{border:1px solid #d2d2d2;border-top:0}}.nav-secondary .breadcrumb{margin-bottom:0;margin-left:0;padding-top:2px;padding-bottom:3px}@media only screen and (min-width: 620px){.nav-secondary .breadcrumb{float:left;margin-left:4px}}.nav-secondary .breadcrumb li{color:#fff;display:inline-block;margin:0;width:100%}@media only screen and (min-width: 620px){.nav-secondary .breadcrumb li{display:inline-block;width:auto}}.nav-secondary .breadcrumb li:first-of-type{border-bottom:1px solid #d2d2d2}@media only screen and (min-width: 620px){.nav-secondary .breadcrumb li:first-of-type{border-bottom:0}}.nav-secondary .breadcrumb li a{color:#888;font-size:1em;display:inline-block;width:100%;margin-right:0;padding:8px 10px;text-decoration:none}@media only screen and (min-width: 620px){.nav-secondary .breadcrumb li a{font-size:.875em}}@media only screen and (min-width: 620px){.nav-secondary .breadcrumb li .breadcrumb-link,.nav-secondary .breadcrumb li .breadcrumb-link--second-level,.nav-secondary .breadcrumb li .active{display:inline-block;float:none;width:auto}}.nav-secondary .breadcrumb li .breadcrumb-link:after,.nav-secondary .breadcrumb li .breadcrumb-link--second-level:after{content:'\203A';display:inline-block;height:5px;margin-left:8px;position:absolute;width:5px}.nav-secondary .second-level-nav,.nav-secondary .third-level-nav{display:none;overflow:hidden;width:100%;margin:0;padding-top:10px;padding-bottom:10px;border-bottom:1px solid #d2d2d2}@media only screen and (min-width: 620px){.nav-secondary .second-level-nav,.nav-secondary .third-level-nav{display:inline;float:none;margin-bottom:0;padding:0;width:auto;border-bottom:0}}.nav-secondary .second-level-nav li,.nav-secondary .third-level-nav li{margin:0}@media only screen and (min-width: 620px){.nav-secondary .second-level-nav li,.nav-secondary .third-level-nav li{float:none;width:auto}}.nav-secondary .second-level-nav li a,.nav-secondary .third-level-nav li a{font-size:.875em;display:block;width:100%;height:100%;padding:10px;color:#333}@media only screen and (max-width: 620px){.nav-secondary .second-level-nav li a.active,.nav-secondary .third-level-nav li a.active{font-weight:500}}@media only screen and (min-width: 620px){.nav-secondary .second-level-nav li a,.nav-secondary .third-level-nav li a{padding:8px 10px 0}.nav-secondary .second-level-nav li a.active,.nav-secondary .third-level-nav li a.active{color:#f7f7f7}}@media only screen and (min-width: 620px){.nav-secondary .second-level-nav li{width:auto}.nav-secondary .second-level-nav li .active,.nav-secondary .second-level-nav li .breadcrumb-link--second-level{color:#888}.nav-secondary .second-level-nav li .third-level-nav li a{color:#333}.nav-secondary .second-level-nav li .third-level-nav li a:hover{color:#f7f7f7}.nav-secondary .second-level-nav li .third-level-nav li .active{color:#f7f7f7;float:none}.nav-secondary .second-level-nav li .third-level-nav li .active:after{content:''}}.third-level-nav li a:hover{color:#f7f7f7}.third-level-nav li .active{color:#f7f7f7;float:none}@media only screen and (max-width: 619px){#breadcrumbs:hover .second-level-nav,#breadcrumbs:hover .third-level-nav,#breadcrumbs:hover .active{border:0;display:block;overflow:visible;float:left;width:100%;position:relative;clear:both}#breadcrumbs:hover li{border:0;float:left}#breadcrumbs:hover .second-level-nav{border-top:1px solid #d2d2d2}#breadcrumbs:hover .second-level-nav li{float:left}#breadcrumbs:hover .third-level-nav{border-bottom:1px solid #d2d2d2;padding-top:0}#breadcrumbs:hover .third-level-nav li{width:50%;display:block;padding-left:10px}}label{cursor:pointer;display:block;margin-bottom:4px}label.has-error{color:#df382c}label.has-warning{color:#eca918}label.has-success{color:#38b44a}label.has-information{color:#19b6ee}input[type='reset']{display:none}input[type='search']{-webkit-appearance:none;border-radius:0}input[type='checkbox']+label,input[type='radio']+label{display:inline;margin-left:5px;vertical-align:middle;width:auto}input.has-error{border:1px solid #df382c}input.has-warning{border:1px solid #eca918}input.has-success{border:1px solid #38b44a}input.has-information{border:1px solid #19b6ee}form ul{margin-left:0;list-style:none}textarea{overflow:auto;vertical-align:top}textarea[readonly='readonly']{color:#888;cursor:default}textarea[readonly='readonly']:active,textarea[readonly='readonly']:focus{border-color:#888;outline:none}fieldset{background-color:#f7f7f7;background-position:-15px -15px;background-repeat:no-repeat;border-radius:4px;border:0;margin-bottom:8px;padding:15px 20px}@media only screen and (min-width: 1440px){fieldset{padding:15px 20px}}fieldset h3{border-bottom:1px dotted #cdcdcd;margin-bottom:9px;padding-bottom:10px}form input,form select,form textarea{width:100%}@media only screen and (min-width: 768px){.one-col{float:left;width:6.40351%;margin-right:2.10526%}.one-col .one-col{width:100%;margin-right:0}}@media only screen and (min-width: 768px){.two-col{float:left;width:14.91228%;margin-right:2.10526%}.two-col .one-col{float:left;width:43.81443%;margin-right:12.37113%}.two-col .two-col{width:100%;margin-right:0}}@media only screen and (min-width: 768px){.three-col{float:left;width:23.42105%;margin-right:2.10526%}.three-col .one-col{float:left;width:27.83505%;margin-right:8.24742%}.three-col .two-col{float:left;width:63.91753%;margin-right:8.24742%}.three-col .three-col{width:100%;margin-right:0}}@media only screen and (min-width: 768px){.four-col{float:left;width:31.92982%;margin-right:2.10526%}.four-col .one-col{float:left;width:20.36082%;margin-right:6.18557%}.four-col .two-col{float:left;width:46.90722%;margin-right:6.18557%}.four-col .three-col{float:left;width:73.45361%;margin-right:6.18557%}.four-col .four-col{width:100%;margin-right:0}}@media only screen and (min-width: 768px){.five-col{float:left;width:40.4386%;margin-right:2.10526%}.five-col .one-col{float:left;width:16.04124%;margin-right:4.94845%}.five-col .two-col{float:left;width:37.03093%;margin-right:4.94845%}.five-col .three-col{float:left;width:58.02062%;margin-right:4.94845%}.five-col .four-col{float:left;width:79.01031%;margin-right:4.94845%}.five-col .five-col{width:100%;margin-right:0}}@media only screen and (min-width: 768px){.six-col{float:left;width:48.94737%;margin-right:2.10526%}.six-col .one-col{float:left;width:13.23024%;margin-right:4.12371%}.six-col .two-col{float:left;width:30.58419%;margin-right:4.12371%}.six-col .three-col{float:left;width:47.93814%;margin-right:4.12371%}.six-col .four-col{float:left;width:65.2921%;margin-right:4.12371%}.six-col .five-col{float:left;width:82.64605%;margin-right:4.12371%}.six-col .six-col{width:100%;margin-right:0}}@media only screen and (min-width: 768px){.seven-col{float:left;width:57.45614%;margin-right:2.10526%}.seven-col .one-col{float:left;width:11.25605%;margin-right:3.53461%}.seven-col .two-col{float:left;width:26.04671%;margin-right:3.53461%}.seven-col .three-col{float:left;width:40.83737%;margin-right:3.53461%}.seven-col .four-col{float:left;width:55.62802%;margin-right:3.53461%}.seven-col .five-col{float:left;width:70.41868%;margin-right:3.53461%}.seven-col .six-col{float:left;width:85.20934%;margin-right:3.53461%}.seven-col .seven-col{width:100%;margin-right:0}}@media only screen and (min-width: 768px){.eight-col{float:left;width:65.96491%;margin-right:2.10526%}.eight-col .one-col{float:left;width:9.79381%;margin-right:3.09278%}.eight-col .two-col{float:left;width:22.68041%;margin-right:3.09278%}.eight-col .three-col{float:left;width:35.56701%;margin-right:3.09278%}.eight-col .four-col{float:left;width:48.45361%;margin-right:3.09278%}.eight-col .five-col{float:left;width:61.34021%;margin-right:3.09278%}.eight-col .six-col{float:left;width:74.2268%;margin-right:3.09278%}.eight-col .seven-col{float:left;width:87.1134%;margin-right:3.09278%}.eight-col .eight-col{width:100%;margin-right:0}}@media only screen and (min-width: 768px){.nine-col{float:left;width:74.47368%;margin-right:2.10526%}.nine-col .one-col{float:left;width:8.66743%;margin-right:2.74914%}.nine-col .two-col{float:left;width:20.084%;margin-right:2.74914%}.nine-col .three-col{float:left;width:31.50057%;margin-right:2.74914%}.nine-col .four-col{float:left;width:42.91714%;margin-right:2.74914%}.nine-col .five-col{float:left;width:54.33372%;margin-right:2.74914%}.nine-col .six-col{float:left;width:65.75029%;margin-right:2.74914%}.nine-col .seven-col{float:left;width:77.16686%;margin-right:2.74914%}.nine-col .eight-col{float:left;width:88.58343%;margin-right:2.74914%}.nine-col .nine-col{width:100%;margin-right:0}}@media only screen and (min-width: 768px){.ten-col{float:left;width:82.98246%;margin-right:2.10526%}.ten-col .one-col{float:left;width:7.7732%;margin-right:2.47423%}.ten-col .two-col{float:left;width:18.02062%;margin-right:2.47423%}.ten-col .three-col{float:left;width:28.26804%;margin-right:2.47423%}.ten-col .four-col{float:left;width:38.51546%;margin-right:2.47423%}.ten-col .five-col{float:left;width:48.76289%;margin-right:2.47423%}.ten-col .six-col{float:left;width:59.01031%;margin-right:2.47423%}.ten-col .seven-col{float:left;width:69.25773%;margin-right:2.47423%}.ten-col .eight-col{float:left;width:79.50515%;margin-right:2.47423%}.ten-col .nine-col{float:left;width:89.75258%;margin-right:2.47423%}.ten-col .ten-col{width:100%;margin-right:0}}@media only screen and (min-width: 768px){.eleven-col{float:left;width:91.49123%;margin-right:2.10526%}.eleven-col .one-col{float:left;width:7.04609%;margin-right:2.2493%}.eleven-col .two-col{float:left;width:16.34148%;margin-right:2.2493%}.eleven-col .three-col{float:left;width:25.63687%;margin-right:2.2493%}.eleven-col .four-col{float:left;width:34.93227%;margin-right:2.2493%}.eleven-col .five-col{float:left;width:44.22766%;margin-right:2.2493%}.eleven-col .six-col{float:left;width:53.52305%;margin-right:2.2493%}.eleven-col .seven-col{float:left;width:62.81844%;margin-right:2.2493%}.eleven-col .eight-col{float:left;width:72.11383%;margin-right:2.2493%}.eleven-col .nine-col{float:left;width:81.40922%;margin-right:2.2493%}.eleven-col .ten-col{float:left;width:90.70461%;margin-right:2.2493%}.eleven-col .eleven-col{width:100%;margin-right:0}}@media only screen and (min-width: 768px){.prepend-one{margin-left:8.50877%}.prepend-two{margin-left:17.01754%}.prepend-three{margin-left:25.52632%}.prepend-four{margin-left:34.03509%}.prepend-five{margin-left:42.54386%}.prepend-six{margin-left:51.05263%}.prepend-seven{margin-left:59.5614%}.prepend-eight{margin-left:68.07018%}.prepend-nine{margin-left:76.57895%}.prepend-ten{margin-left:85.08772%}.prepend-eleven{margin-left:93.59649%}}@media only screen and (min-width: 768px){.append-one{margin-right:8.50877%}.append-two{margin-right:17.01754%}.append-three{margin-right:25.52632%}.append-four{margin-right:34.03509%}.append-five{margin-right:42.54386%}.append-six{margin-right:51.05263%}.append-seven{margin-right:59.5614%}.append-eight{margin-right:68.07018%}.append-nine{margin-right:76.57895%}.append-ten{margin-right:85.08772%}.append-eleven{margin-right:93.59649%}}@media only screen and (min-width: 768px){.push-one{float:left;position:relative;margin:0 -8.50877% 0 8.50877%}.push-two{float:left;position:relative;margin:0 -19.12281% 0 19.12281%}.push-three{float:left;position:relative;margin:0 -27.63158% 0 27.63158%}.push-four{float:left;position:relative;margin:0 -36.14035% 0 36.14035%}.push-five{float:left;position:relative;margin:0 -44.64912% 0 44.64912%}.push-six{float:left;position:relative;margin:0 -53.15789% 0 53.15789%}.push-seven{float:left;position:relative;margin:0 -61.66667% 0 61.66667%}.push-eight{float:left;position:relative;margin:0 -70.17544% 0 70.17544%}.push-nine{float:left;position:relative;margin:0 -78.68421% 0 78.68421%}.push-ten{float:left;position:relative;margin:0 -87.19298% 0 87.19298%}.push-eleven{float:left;position:relative;margin:0 -95.70175% 0 95.70175%}}@media only screen and (min-width: 768px){.pull-one{float:left;position:relative;margin-left:-6.40351%}.pull-two{float:left;position:relative;margin-left:17.01754%}.pull-three{float:left;position:relative;margin-left:25.52632%}.pull-four{float:left;position:relative;margin-left:34.03509%}.pull-five{float:left;position:relative;margin-left:42.54386%}.pull-six{float:left;position:relative;margin-left:51.05263%}.pull-seven{float:left;position:relative;margin-left:59.5614%}.pull-eight{float:left;position:relative;margin-left:68.07018%}.pull-nine{float:left;position:relative;margin-left:76.57895%}.pull-ten{float:left;position:relative;margin-left:85.08772%}.pull-eleven{float:left;position:relative;margin-left:93.59649%}}.banner{background:#f7f7f7;border-bottom:0;border-top:0;box-shadow:inset 0 -1px 0 #ccc;display:block;min-width:100%;position:relative;width:auto;z-index:2}@media only screen and (min-width: 620px){.banner{border-bottom:1px solid #ccc;box-shadow:none}}.banner .logo{position:relative;display:table;float:left;overflow:hidden;height:48px;margin:0 10px;border-left:0}@media only screen and (min-width: 620px){.banner .logo{margin:0 15px}}.banner .logo a{display:table-cell;height:100%;vertical-align:middle;color:#fff}.banner .logo a span{display:inline-block}.banner h2{font-size:1.563em;position:relative;top:14px;left:4px;display:block;margin-bottom:0;text-transform:lowercase}.banner h2 a,.banner h2 a:link,.banner h2 a:visited{float:left;text-decoration:none;color:#fff}.banner .nav-primary{overflow:hidden;margin:0 auto;border:0}@media only screen and (min-width: 620px){.banner .nav-primary{max-width:1440px}}.banner .nav-primary span{display:none}.banner .nav-primary ul{display:none;float:left;width:100%;margin:0;padding:0;border-top:1px solid #ccc;box-shadow:inset 0 -1px 0 #ccc;background-color:#ebebeb}@media only screen and (min-width: 620px){.banner .nav-primary ul{position:static;display:block;width:auto;border-top:0;background-color:transparent;box-shadow:none}}.banner .nav-primary ul li{float:left;width:50%;margin:0;border-right:1px solid #ccc;border-bottom:1px solid #ccc;background:transparent}@media only screen and (min-width: 620px){.banner .nav-primary ul li{width:auto;border-right:0;border-bottom:0;border-left:1px solid #e3e3e3}.banner .nav-primary ul li:last-child{border-right:1px solid #e3e3e3}.banner .nav-primary ul li:last-child a{border-right:0}}@media only screen and (max-width: 620px){.banner .nav-primary ul li:nth-child(2n+2){border-right:0}}.banner .nav-primary ul li a,.banner .nav-primary ul li a:link,.banner .nav-primary ul li a:visited{font-size:1em;font-weight:300;position:relative;display:block;margin-bottom:0;padding:8px 10px;text-align:left;text-decoration:none;background-color:#ebebeb;font-smoothing:subpixel-antialiased;color:#333}@media only screen and (min-width: 620px){.banner .nav-primary ul li a,.banner .nav-primary ul li a:link,.banner .nav-primary ul li a:visited{font-size:.875em;padding:14px 14px 13px;text-align:center;border-left:1px solid #fff;background-color:transparent;color:#fff}}.banner .nav-primary ul li a:hover,.banner .nav-primary ul li a:link:hover,.banner .nav-primary ul li a:visited:hover{background:#f2f2f2}@media only screen and (min-width: 620px){.banner .nav-primary ul li a:hover,.banner .nav-primary ul li a:link:hover,.banner .nav-primary ul li a:visited:hover{background-color:#fff}}.banner .nav-primary ul li a.active,.banner .nav-primary ul li a:link.active,.banner .nav-primary ul li a:visited.active{background-color:#ddd}@media only screen and (min-width: 620px){.banner .nav-primary ul li a.active,.banner .nav-primary ul li a:link.active,.banner .nav-primary ul li a:visited.active{background-color:#e3e3e3;border-left:0}}.banner .nav-toggle{position:absolute;top:0;right:0;display:block;width:48px;height:48px;cursor:pointer;text-indent:-99999px;background-image:url("https://assets.ubuntu.com/v1/12387180-navigation-menu-plain.svg");background-repeat:no-repeat;background-position:center center;background-size:25px auto}@media only screen and (min-width: 620px){.banner .nav-toggle{display:none}}.banner .nav-toggle .nav-toggle__link{width:48px;height:48px}.banner .nav-toggle .nav-toggle__link.open{display:block}.banner .nav-toggle .nav-toggle__link.close{display:none}@media only screen and (max-width: 620px){.banner #nav:hover ul{display:block}.banner #nav:hover ul ul{display:none}.banner #nav:hover .nav-toggle .nav-toggle__link.open{display:none}.banner #nav:hover .nav-toggle .nav-toggle__link.close{display:block}}ol,ul{margin-left:20px;margin-bottom:20px}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}nav ul,nav ol{list-style:none;list-style-image:none}li{font-size:1em;line-height:1.5;margin:0 0 .4em;padding:0}.list-ticks li{background-image:url("data:image/svg+xml;utf8, <svg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 14 14'><circle fill='%23c4c4c4' cx='7' cy='7' r='7'/><path fill='%23fff' d='M6.1 10.813L2.41 8.105l1.184-1.613L5.9 8.187l4.393-4.394 1.414 1.414z' /></svg>")}.no-bullets{list-style:none;margin-left:0}.combined-list ul,.combined-list div{margin-bottom:0}.combined-list .last-item{border-bottom:1px dotted #888;padding-bottom:10px}.combined-list .last-col{margin-bottom:20px}.combined-list .last-col .last-item{border-bottom:0;padding-bottom:0}@media only screen and (min-width: 768px){.combined-list ul,.combined-list div{margin-bottom:20px}.combined-list .last-item{border-bottom:0;padding-bottom:0}}.inline-list{margin-left:0}.inline-list li{display:inline;list-style:none;margin-right:20px}.inline-list .last-item{margin-right:0}.list-step{list-style:none;margin-left:60px}@media only screen and (max-width: 1440px){.list-step__item:first-child{margin-top:10px}}@media only screen and (min-width: 1440px){.list-step__title{margin-bottom:0}}.list-step__bullet{box-shadow:0 1px 3px 1px rgba(51,51,51,0.2);background:#fff;border-radius:50%;padding:.3em .68em;display:inline-block;color:#f7f7f7;margin-right:.34375em;margin-bottom:.625em;margin-left:-60px}@media only screen and (max-width: 1440px){.list-step__bullet{position:absolute;top:-5px}}.row{border-bottom:1px dotted #888;clear:both;padding:20px 10px 0;position:relative}.row br{display:none}.row.no-padding-bottom{padding-bottom:0}.row::after{clear:both;content:'.';display:block;height:0;visibility:hidden}.row--light{background:#fff}.row--dark{background:#333;color:#fff}.row.row-grey,.row.row--grey{background:#f7f7f7;border:0;margin-top:-1px}.no-border{border:0}.row-hero{margin-top:20px;padding-top:0}.strip{width:100%;display:block}.strip-inner-wrapper{max-width:1440px;margin:auto}@media only screen and (min-width: 768px){.row-hero{margin-top:40px}.row{border-radius:0;margin:0;padding:40px 20px 20px}.row-grey{margin-top:-1px}}@media only screen and (min-width: 769px){.row br{display:block}}@media only screen and (min-width: 1440px){.row br{display:block}.row{padding:60px 20px 40px}.no-border{border:0}}.header-search [type="search"],.header-search [type="text"],.search-form [type="search"],.search-form [type="text"]{-webkit-appearance:none;background-color:#dedede;box-shadow:none;color:#333;display:block;float:left;font-size:1em;margin-bottom:0;padding:12px 10px;transition:all .5s ease-out;width:100%}.header-search .svg-search-handle,.search-form .svg-search-handle{fill:#333}.header-search .svg-search-frame,.search-form .svg-search-frame{stroke:#333}.header-search placeholder,.search-form placeholder{color:#333;opacity:1}.header-search input:placeholder,.search-form input:placeholder{color:#333;opacity:1}.header-search ::placeholder,.search-form ::placeholder{color:#333;opacity:1}.header-search [type="search"]:focus,.search-form [type="search"]:focus{background-color:#d3d3d3;border-color:#b3b3b3}.header-search [type=submit],.search-form [type=submit]{background:none;display:block;float:left;line-height:0;margin-left:-40px;overflow:visible;padding:3px 2px;width:auto}.header-search [type=submit]:hover,.search-form [type=submit]:hover{background:none}.header-search [type=submit] img,.search-form [type=submit] img{height:28px;width:28px;margin-top:2px}.banner .search-toggle{background-image:url("data:image/svg+xml;utf8, <svg xmlns='http://www.w3.org/2000/svg' width='28' height='28' viewBox='0 0 90 90'><g color='%23333'><path fill='none' stroke-width='4' overflow='visible' enable-background='accumulate' d='M0 0h90v90H0z'/><path d='M69 36.5a33 33.5 0 1 1-66 0 33 33.5 0 1 1 66 0z' transform='matrix(.636 0 0 .627 16.114 16.12)' fill='none' stroke='%23333' stroke-width='9.5' overflow='visible' enable-background='accumulate'/><path d='M55.77 52.92L52.94 55.75l14 14 2.83-2.83-14-14z' font-size='xx-small' fill='%23333' stroke-width='6' overflow='visible' enable-background='accumulate' font-family='Sans' class='s0'/><path d='M60.97 57.03c-1.55-3.04 1.02-3.63 2.46-0.58 1.44-0.21 3.21 4.29l9.19 9.2c2.68 2.85 3.26 2.46 5.64 2.38-2.38 2.77-2.79-0.08-5.65l-9.19-9.2c-0.73-0.75-1.78-1.19-2.83-1.19z' font-size='xx-small' fill='%23333' stroke-width='11.8' overflow='visible' enable-background='accumulate' font-family='Sans' class='s0'/></g></svg>");background-position:center center;background-repeat:no-repeat;background-size:20px 20px;display:block;height:48px;outline:none;overflow:hidden;position:absolute;right:0;text-indent:-999em;top:0;width:24px}.banner .search-toggle .search-toggle__link{width:48px;height:48px}.banner .search-toggle .search-toggle__link.open{display:block}.banner .search-toggle .search-toggle__link.close{display:none}#site-search:hover form{display:block}#site-search:hover .search-toggle .search-toggle__link.open{display:none}#site-search:hover .search-toggle .search-toggle__link.close{display:block}.header-search,.search-form{background:#f7f7f7;border:0;display:none;float:left;position:relative;margin:0;width:100%;z-index:3}.search-form.active,.header-search.active,.header-search.open{display:block}.search-form div,.header-search div{box-shadow:inset 0 -4px 4px -4px rgba(0,0,0,0.3),inset 0 5px 5px -5px rgba(0,0,0,0.3);background:#fff;margin:10px;position:relative;z-index:1}.search-form form [type="search"],.header-search form [type="search"]{background:#fff;border:0;box-shadow:0 2px 2px rgba(0,0,0,0.3) inset,0 -1px 3px rgba(0,0,0,0.2) inset,0 2px 0 rgba(255,255,255,0.4);color:#333;display:block;float:left;font-size:1em;height:auto;margin:0;padding:8px 10px;width:100%}.yes-js .header-inner .search-form,.yes-js .header-inner .header-search{display:none}.yes-js .header-inner .search-form form,.yes-js .header-inner .header-search form{margin-left:0;margin-right:0;overflow:hidden;padding:10px;position:relative;top:0;width:100%;z-index:999}@media only screen and (max-width: 620px){.banner .search-toggle{right:0}.no-svg .search-toggle,.opera-mini .search-toggle{background-image:url("https://assets.ubuntu.com/v1/75d8151d-search-white.png")}}@media only screen and (min-width: 620px){.banner .search-toggle{display:none}}@media only screen and (min-width: 620px){.search-form,.header-search{background:none;border-right:0 none;float:right;margin-bottom:0;max-width:220px;overflow:hidden;padding:7px 0 5px 14px}.search-form form [type="text"],.search-form form [type="search"],.header-search form [type="text"],.header-search form [type="search"]{box-shadow:0 2px 4px rgba(0,0,0,0.4) inset;box-sizing:content-box;background-color:#dedede;border:0 solid #d8d8d8;border-width:0 0 1px;color:#333;font-size:.813em;height:24px;margin-bottom:0;padding:.5em 2.5em .5em .5em;transition:all .5s ease 0s;width:86px}.search-form form [type="text"]:focus,.search-form form [type="search"]:focus,.header-search form [type="text"]:focus,.header-search form [type="search"]:focus{background-color:#d3d3d3;border-color:#c4c4c4}.search-form .svg-search-handle,.header-search .svg-search-handle{fill:#333}.search-form .svg-search-frame,.header-search .svg-search-frame{stroke:#333}.search-form placeholder,.header-search placeholder{color:#333}.search-form input:placeholder,.header-search input:placeholder{color:#333}.search-form ::placeholder,.header-search ::placeholder{color:#333}}@media only screen and (min-width: 620px){.header-search .svg-search-handle,.search-form .svg-search-handle{fill:#333}.header-search .svg-search-frame,.search-form .svg-search-frame{stroke:#333}.header-search placeholder,.search-form placeholder{color:#333}.header-search input:placeholder,.search-form input:placeholder{color:#333}.header-search ::placeholder,.search-form ::placeholder{color:#333}}@media only screen and (max-width: 620px){.banner .nav-primary .header-search{position:relative;top:0;width:100%}.banner .nav-primary .header-search [type="search"]{background-color:#ebebeb;color:#333}.banner .nav-primary .header-search [type="submit"]{background-color:transparent;height:38px;margin-top:0;width:32px}.banner .nav-primary .header-search [type="submit"] img,.banner .nav-primary .header-search [type="submit"] svg{max-width:none}.banner .nav-primary .header-search.open{display:block}.banner .search-toggle{background-image:url("data:image/svg+xml;utf8, <svg xmlns='http://www.w3.org/2000/svg' width='28' height='28' viewBox='0 0 90 90'><g color='%23333'><path fill='none' stroke-width='4' overflow='visible' enable-background='accumulate' d='M0 0h90v90H0z'/><path d='M69 36.5a33 33.5 0 1 1-66 0 33 33.5 0 1 1 66 0z' transform='matrix(.636 0 0 .627 16.114 16.12)' fill='none' stroke='%23333' stroke-width='9.5' overflow='visible' enable-background='accumulate'/><path d='M55.77 52.92L52.94 55.75l14 14 2.83-2.83-14-14z' font-size='xx-small' fill='%23333' stroke-width='6' overflow='visible' enable-background='accumulate' font-family='Sans' class='s0'/><path d='M60.97 57.03c-1.55-3.04 1.02-3.63 2.46-0.58 1.44-0.21 3.21 4.29l9.19 9.2c2.68 2.85 3.26 2.46 5.64 2.38-2.38 2.77-2.79-0.08-5.65l-9.19-9.2c-0.73-0.75-1.78-1.19-2.83-1.19z' font-size='xx-small' fill='%23333' stroke-width='11.8' overflow='visible' enable-background='accumulate' font-family='Sans' class='s0'/></g></svg>");background-position:center center;background-repeat:no-repeat;background-size:25px auto;cursor:pointer;display:block;height:48px;position:absolute;right:0;text-indent:-99999px;width:48px}.no-svg .banner .search-toggle,.opera-mini .banner .search-toggle{background-image:url("https://assets.ubuntu.com/v1/2196e362-search-white.svg")}.opera-mini x:-o-prefocus,.opera-mini .banner .search-toggle{background-size:25px auto}}@media only screen and (min-width: 620px){.search-form,.header-search{display:block}.search-form .svg-search-handle,.header-search .svg-search-handle{fill:#333}.search-form .svg-search-frame,.header-search .svg-search-frame{stroke:#333}.search-form form [type="text"]:focus,.header-search form [type="text"]:focus{width:160px}.search-form [type="search"],.search-form [type="text"],.header-search [type="search"],.header-search [type="text"]{padding:8px 10px}}@media only screen and (max-width: 1440px){.search-form,.header-search{margin-right:10px}}@media only screen and (max-width: 620px){.banner .search-toggle{right:48px}}.ubuntu-search .nav-secondary,.search-results .nav-secondary,.search-no-results .nav-secondary{display:none}.ubuntu-search section>h1,.ubuntu-search section article h1,.search-results section>h1,.search-results section article h1,.search-no-results section>h1,.search-no-results section article h1{padding-bottom:10px;font-size:1.438em;margin-bottom:0}.ubuntu-search section>h1,.search-results section>h1,.search-no-results section>h1{border-bottom:1px dotted #cdcdcd}.ubuntu-search .main-search,.search-results .main-search,.search-no-results .main-search{background-color:transparent;margin:0 0 20px;padding:20px 0}.ubuntu-search .main-search [type="search"],.search-results .main-search [type="search"],.search-no-results .main-search [type="search"]{border:1px solid #888;float:left;font-size:2em;padding:.2em 65px .2em .2em;width:100%}.ubuntu-search .main-search [type=submit],.search-results .main-search [type=submit],.search-no-results .main-search [type=submit]{width:32px;height:38px;background-repeat:no-repeat;background-position:center 8px;background-color:transparent;background-size:28px 28px;display:block;float:left;line-height:0;margin-left:-53px;margin-top:-4px;overflow:visible;padding:4px}.ubuntu-search .main-search [type=submit] img,.search-results .main-search [type=submit] img,.search-no-results .main-search [type=submit] img{height:45px;width:45px}.ubuntu-search .main-search [type=submit]:hover,.search-results .main-search [type=submit]:hover,.search-no-results .main-search [type=submit]:hover{background:none}.ubuntu-search .search-result h1 .title-main,.search-results .search-result h1 .title-main,.search-no-results .search-result h1 .title-main{margin-right:20px}.ubuntu-search .search-result h1 .result-url,.search-results .search-result h1 .result-url,.search-no-results .search-result h1 .result-url{color:#888;display:block;overflow:hidden;padding-bottom:2px;text-overflow:ellipsis;vertical-align:bottom}.ubuntu-search .search-result h1 .result-url a,.search-results .search-result h1 .result-url a,.search-no-results .search-result h1 .result-url a{color:#888}.ubuntu-search .search-result p,.search-results .search-result p,.search-no-results .search-result p{margin-bottom:0}.ubuntu-search .num-results,.search-results .num-results,.search-no-results .num-results{display:inline-block;margin-left:20px}.ubuntu-search .bottom-results-total,.search-results .bottom-results-total,.search-no-results .bottom-results-total{margin:0;overflow:visible;padding-top:20px;text-align:center;width:100%}.ubuntu-search .bottom-nav,.search-results .bottom-nav,.search-no-results .bottom-nav{margin-top:-26px;overflow:hidden}.ubuntu-search .bottom-nav ul,.search-results .bottom-nav ul,.search-no-results .bottom-nav ul{margin-bottom:0;margin-left:0;overflow:hidden;padding:0}.ubuntu-search .bottom-nav li,.search-results .bottom-nav li,.search-no-results .bottom-nav li{float:left;margin-left:15px}.ubuntu-search .bottom-nav li:first-child,.search-results .bottom-nav li:first-child,.search-no-results .bottom-nav li:first-child{margin-left:0}.ubuntu-search .nav-back,.search-results .nav-back,.search-no-results .nav-back{float:left}.ubuntu-search .nav-back li:before,.search-results .nav-back li:before,.search-no-results .nav-back li:before{color:#f7f7f7;content:'\2039';margin-right:5px}.ubuntu-search .nav-back .item-extreme:before,.search-results .nav-back .item-extreme:before,.search-no-results .nav-back .item-extreme:before{content:'\2039\2039'}.ubuntu-search .nav-forward,.search-results .nav-forward,.search-no-results .nav-forward{float:right}.ubuntu-search .nav-forward li:after,.search-results .nav-forward li:after,.search-no-results .nav-forward li:after{color:#f7f7f7;content:'\203A';margin-left:5px}.ubuntu-search .nav-forward .item-extreme:after,.search-results .nav-forward .item-extreme:after,.search-no-results .nav-forward .item-extreme:after{content:'\203A\203A'}.ubuntu-search .error-notification,.search-results .error-notification,.search-no-results .error-notification{background-color:#fff;color:#333;display:block;margin-top:20px;padding:20px;width:100%}.ubuntu-search .result-line,.search-results .result-line,.search-no-results .result-line{color:#888}.ubuntu-search .results-top,.search-results .results-top,.search-no-results .results-top{border-bottom:1px dotted #cdcdcd;padding-bottom:.5em}.ubuntu-search .search-container,.search-results .search-container,.search-no-results .search-container{padding-bottom:0}@media only screen and (min-width: 620px){.ubuntu-search .main-search [type=submit]{margin-left:-60px;margin-top:0}}@font-face{font-family:'Ubuntu';font-style:normal;font-weight:300;src:url("../assets/fonts/ubuntu-l-webfont.woff2") format("woff2"),url("../assets/fonts/ubuntu-l-webfont.woff") format("woff")}@font-face{font-family:'Ubuntu';font-style:normal;font-weight:400;src:url("../assets/fonts/ubuntu-r-webfont.woff2") format("woff2"),url("../assets/fonts/ubuntu-r-webfont.woff") format("woff")}@font-face{font-family:'Ubuntu';font-style:normal;font-weight:700;src:url("../assets/fonts/ubuntu-b-webfont.woff2") format("woff2"),url("../assets/fonts/ubuntu-b-webfont.woff") format("woff")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:300;src:url("../assets/fonts/ubuntu-li-webfont.woff2") format("woff2"),url("../assets/fonts/ubuntu-li-webfont.woff") format("woff")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:400;src:url("../assets/fonts/ubuntu-ri-webfont.woff2") format("woff2"),url("../assets/fonts/ubuntu-ri-webfont.woff") format("woff")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:700;src:url("../assets/fonts/ubuntu-bi-webfont.woff2") format("woff2"),url("../assets/fonts/ubuntu-bi-webfont.woff") format("woff")}@font-face{font-family:'Ubuntu Mono';font-style:normal;font-weight:400;src:url("../assets/fonts/ubuntumono-r-webfont.woff2") format("woff2"),url("../assets/fonts/ubuntumono-r-webfont.woff") format("woff")}body{color:#333;font-family:'Ubuntu', Arial, 'libra sans', sans-serif;font-size:16px;font-weight:300}a:focus{outline:thin dotted}a:hover,a:active{outline:0}a{color:#f7f7f7;text-decoration:none}a:hover,a:active,a:focus{text-decoration:underline}strong{font-weight:400}.caps-centered,.muted-heading{font-size:.875em;margin-bottom:20px;text-align:center;text-transform:uppercase}small,.smaller{font-size:13px}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{vertical-align:text-top}sub{vertical-align:text-bottom}pre{border-radius:4px;background-color:#fff;padding:.6em 1em;white-space:pre-wrap;word-wrap:break-word}p+h2,ul+h2,ol+h2,pre+h2{margin-top:0.5625em}header nav a:link{font-weight:normal}p+h3,ul+h3,ol+h3,pre+h3{margin-top:.783em}p+h4,ul+h4,ol+h4,pre+h4{margin-top:1.21875}ol+h2,p+h2,pre+h2,ul+h2{margin-top:.563em}ol+h3,p+h3,pre+h3,ul+h3{margin-top:.783em}ol+h4,p+h4,pre+h4,ul+h4{margin-top:1.219em}.intro{font-size:1em;line-height:1.4}.row div p:last-child,.row ul p:last-child{margin-bottom:0}.four-col p:last-child{margin-bottom:0}.note{color:#888;font-size:.813em}h1,h2,h3,h4,h5,h6{font-family:Ubuntu, Arial, 'libra sans', sans-serif;font-weight:300;line-height:1.3}h1{font-size:2.8125em;margin-bottom:.5em}h2{font-size:2em;margin-bottom:.5em}h3{font-size:1.4375em;margin-bottom:.522em}h4{font-size:1.25em;font-weight:400;margin-bottom:.615em}h5{font-size:1em;font-weight:700;margin-bottom:1em}h6{font-size:.8125em;font-weight:400;margin-bottom:1em;letter-spacing:.1em;text-transform:uppercase}p,li{font-size:1em;line-height:1.5;margin:0;margin-bottom:.75em;padding:0}button,input,select,textarea{font-family:Ubuntu,Arial,'libra sans',sans-serif}@media only screen and (min-width: 768px) and (max-width: 1440px){h1{font-size:1.5234375em;margin-bottom:.5em}h2{font-size:1.348125em;margin-bottom:.5em}h3{font-size:1.1428125em;margin-bottom:.522em}h4{font-size:1.171875em;font-weight:400;margin-bottom:.615em}h5{font-size:.9375em;font-weight:700;margin-bottom:1em}h6{font-size:.6778125em;font-weight:400;margin-bottom:1em;letter-spacing:.1em;text-transform:uppercase}.intro{font-size:1.13333em}}@media only screen and (max-width: 768px){h1{font-size:1.421875em;margin-bottom:.4375em}h2{font-size:1.25825em;margin-bottom:.4375em}h3{font-size:1.066625em;margin-bottom:.45675em}h4{font-size:1.09375em;font-weight:400;margin-bottom:.538125em}h5{font-size:.875em;font-weight:700;margin-bottom:.875em}h6{font-size:.632625em;font-weight:400;margin-bottom:.875em;letter-spacing:.1em;text-transform:uppercase}p,li{font-size:.875em}}@media only screen and (min-width: 1440px){p,li,code,pre{font-size:16px;line-height:1.5;margin-bottom:.75em}.intro{font-size:1.25em}}dfn{font-style:italic}code,pre{font-family:'Ubuntu Mono', 'Consolas', 'Monaco', 'Lucida Console', 'Courier New', Courier, monospace}table{border-collapse:collapse;border-spacing:0;overflow-x:scroll;margin-bottom:20px;margin:0 0 2.5em;width:100%}table th,table td{background:#f7f7f7;border:1px dotted #888;padding:15px 10px}table td{text-align:center;vertical-align:middle}table thead th{border-collapse:separate;border-spacing:0 10px;background:#fee3d2;color:#333;font-weight:normal}table tbody th{font-weight:300;text-align:left}table th[scope='col']{text-align:center}table thead th:first-of-type{text-align:left}@media only screen and (max-width: 768px){table{display:block}}body footer.global #nav-global li:first-of-type a{margin-left:0}footer.global{background:none;border-top:0;box-shadow:inset 0 2px 2px -1px #cdcdcd;clear:both;display:block;padding:30px 10px 20px;position:relative;width:100%}footer.global .legal{background-image:none;clear:both;margin:0 auto;min-height:40px;position:relative;width:100%}footer.global .legal p,footer.global .legal ul{padding-left:0}footer.global h2{font-size:.75em;line-height:1.4;margin-bottom:0;padding-bottom:.5em}footer.global h2,footer.global h2 a:link,footer.global h2 a:visited{color:#333;font-weight:normal}footer.global ul{margin:0}footer.global li a:hover{color:#f7f7f7}footer.global li ul li a:link,footer.global li ul li a:visited{color:#333;font-size:.75em}footer.global h2 a:hover,footer.global h2 a:active{color:#f7f7f7}footer.global p{color:#333;font-size:12px;margin-bottom:0}@media only screen and (max-width: 768px){footer.no-global .legal{box-shadow:0 2px 2px -1px #cdcdcd inset;box-sizing:content-box;margin-left:-10px;padding-left:10px;padding-right:10px;padding-top:10px}}@media only screen and (min-width: 1440px){footer.global .legal{width:1440px}footer.global{padding:30px 0 20px}}svg:not(:root){overflow:hidden}figure{width:100%}figure caption{display:block;width:100%;text-align:center}object,iframe,embed,canvas,video,audio{display:block;max-width:100%;margin:0 auto 20px}audio:not([controls]){display:none;height:0}[hidden]{display:none}.video-container{position:relative;padding-bottom:56.25%;padding-top:30px;height:0;overflow:hidden}.video-container iframe{position:absolute;top:0;left:0;width:100%;height:100%}.video-container h3,.video-container .video-title{margin-top:20px}.inline-logos{float:left;margin-left:0;padding:0;text-align:center;width:100%}.inline-logos .inline-logos__item{display:inline-block;margin-right:20px;padding:0 0 20px;width:36%}@media only screen and (max-width: 300px){.inline-logos .inline-logos__item{margin:0 0 20px;width:100%}}.inline-logos .inline-logos__item.clear-row{clear:left}.inline-logos .inline-logos__item.last-item{border:0}.inline-logos .inline-logos__image{max-height:32px;max-width:115px;transition:all .3s ease-out;vertical-align:middle}@media only screen and (min-width: 768px){.inline-logos{padding-top:20px}.inline-logos .inline-logos__item{display:inline-block;height:56px;line-height:60px;margin:0 30px 30px;width:150px}.inline-logos .inline-logos__image{float:none;height:auto;max-height:56px;max-width:150px;vertical-align:middle}}@media only screen and (min-width: 1440px){.inline-logos__item{margin-bottom:40px}}@media only screen and (min-width: 768px){.equal-height__align-vertically{align-items:center;justify-content:center}}@media only screen and (min-width: 768px){.equal-height--vertical-divider{position:relative}.equal-height--vertical-divider__item{padding-left:10px;padding-right:10px}.equal-height--vertical-divider__item:before{content:'';position:absolute;right:-10px;top:0;height:100%;width:1px;border-right:1px dotted #888}.equal-height--vertical-divider .last-col,.equal-height--vertical-divider__item:last-of-type{padding-right:0}.equal-height--vertical-divider .last-col:before,.equal-height--vertical-divider__item:last-of-type:before{border-right:0}.equal-height--vertical-divider__item:first-of-type{padding-left:0}}@media only screen and (max-width: 768px){.equal-height--vertical-divider .equal-height--vertical-divider__item{border-bottom:1px dotted #888;padding-bottom:20px}.equal-height--vertical-divider .equal-height--vertical-divider__item:last-of-type{border-bottom:0;padding-bottom:inherit}}body{background:url("../assets/img/backgrounds/image-background-paper.png") repeat-y center top #f7f7f7}.button--neutral,.button--inline-neutral{color:#333;background-color:transparent;border:1px solid #cdcdcd}.button--neutral:focus,.button--neutral:active,.button--neutral:hover,.button--inline-neutral:focus,.button--inline-neutral:active,.button--inline-neutral:hover{background-color:rgba(0,0,0,0.1)}.button--neutral:disabled:focus,.button--neutral:disabled:active,.button--neutral:disabled:hover,.button--neutral.button--disabled:focus,.button--neutral.button--disabled:active,.button--neutral.button--disabled:hover,.button--inline-neutral:disabled:focus,.button--inline-neutral:disabled:active,.button--inline-neutral:disabled:hover,.button--inline-neutral.button--disabled:focus,.button--inline-neutral.button--disabled:active,.button--inline-neutral.button--disabled:hover{background-color:transparent}.button--inline-neutral{display:inline-block;width:auto}.button--positive,.button--inline-positive{color:#fff;background-color:#38b44a}.button--positive:focus,.button--positive:active,.button--positive:hover,.button--inline-positive:focus,.button--inline-positive:active,.button--inline-positive:hover{background-color:#2c8d3a}.button--positive:disabled:focus,.button--positive:disabled:active,.button--positive:disabled:hover,.button--positive.button--disabled:focus,.button--positive.button--disabled:active,.button--positive.button--disabled:hover,.button--inline-positive:disabled:focus,.button--inline-positive:disabled:active,.button--inline-positive:disabled:hover,.button--inline-positive.button--disabled:focus,.button--inline-positive.button--disabled:active,.button--inline-positive.button--disabled:hover{background-color:#38b44a}.button--inline-positive{display:inline-block;width:auto}.button--destructive,.button--inline-destructive{color:#fff;background-color:#df382c}.button--destructive:focus,.button--destructive:active,.button--destructive:hover,.button--inline-destructive:focus,.button--inline-destructive:active,.button--inline-destructive:hover{background-color:#bc271c}.button--destructive:disabled:focus,.button--destructive:disabled:active,.button--destructive:disabled:hover,.button--destructive.button--disabled:focus,.button--destructive.button--disabled:active,.button--destructive.button--disabled:hover,.button--inline-destructive:disabled:focus,.button--inline-destructive:disabled:active,.button--inline-destructive:disabled:hover,.button--inline-destructive.button--disabled:focus,.button--inline-destructive.button--disabled:active,.button--inline-destructive.button--disabled:hover{background-color:#df382c}.button--inline-destructive{display:inline-block;width:auto}.button--base,.button--inline-base{color:#333;background-color:transparent}.button--base:focus,.button--base:active,.button--base:hover,.button--inline-base:focus,.button--inline-base:active,.button--inline-base:hover{background-color:rgba(0,0,0,0.1)}.button--base:disabled:focus,.button--base:disabled:active,.button--base:disabled:hover,.button--base.button--disabled:focus,.button--base.button--disabled:active,.button--base.button--disabled:hover,.button--inline-base:disabled:focus,.button--inline-base:disabled:active,.button--inline-base:disabled:hover,.button--inline-base.button--disabled:focus,.button--inline-base.button--disabled:active,.button--inline-base.button--disabled:hover{background-color:transparent}.button--inline-base{display:inline-block;width:auto}.cookie-policy{box-shadow:0 -1px 2px rgba(0,0,0,0.2);background-color:#fae4dc;position:fixed;bottom:0;width:100%;z-index:100}.cookie-policy p{font-size:.8125em;margin-bottom:0;margin-left:0;padding:8px 0;width:100%}.cookie-policy .link-cta{background-image:url("https://assets.ubuntu.com/v1/3f057022-close-orange.svg");background-repeat:no-repeat;color:#fff;float:right;font-size:1em;height:15px;margin:12px 0;margin-top:12px;padding:0;text-decoration:none;text-indent:-9999px;width:16px}.no-svg .cookie-policy .link-cta,.opera-mini .cookie-policy .link-cta{background-image:url("https://assets.ubuntu.com/v1/898777ac-close-orange.png")}.deep-link{text-decoration:none}.deep-link:after{content:'';display:inline-block;margin-left:3px;opacity:0;position:relative;top:1px;width:1em;height:1em;background-image:url(https://assets.ubuntu.com/v1/128877a5-anchor_16.svg);background-position:0 80%;background-repeat:no-repeat;background-size:16px;transition:opacity .1s}.deep-link:hover{text-decoration:none}.deep-link:hover:after{opacity:1}.banner{background:#000;box-shadow:none}@media only screen and (min-width: 620px){.banner .nav-primary{width:auto}.banner ul{border-top:0;border-right:0;box-shadow:none}.banner li{width:auto;border-right:0;border-bottom:0}.banner li:last-child a{border-right:0}.banner a,.banner a:link,.banner a:visited{border-left:0}}@media only screen and (max-width: 768px){footer.global{padding-top:0}}.instruction{padding:0;position:relative;width:100%;border-bottom:1px dotted #ddd}.instruction .instruction__bullet,.instruction .instruction__details{padding:60px 40px;margin-bottom:0}.instruction .instruction__bullet{margin-right:0}.instruction .instruction__step{display:inline-block;border-radius:50%;width:50px;height:50px;line-height:50px;color:#fff;text-align:center;vertical-align:top;font-size:2em;font-weight:400}.instruction .instruction__title{display:inline;position:relative;top:6px;line-height:1.6}.instruction .command-line{position:relative;border-radius:4px;background-color:#2c001e;border:1px solid #2c001e;overflow:hidden;transition:all .2s}.instruction .command-line .command-line__input{border:0;background:transparent;font-size:1em;font-family:Ubuntu Mono;font-weight:300;padding:.7em 1em;color:#fff;width:100%}.instruction .command-line .command-line__copy-button{transition:background-color .2s;position:absolute;right:0;top:0;width:50px;border:0;height:100%;display:block;text-indent:-9999px;background-image:url("https://assets.ubuntu.com/v1/994e60f9-get-link-url_16.svg");background-repeat:no-repeat;background-position:center;background-color:#fff}.row{border-bottom:0;background-color:rgba(255,255,255,0.6)}@media only screen and (max-width: 768px){.row{padding-bottom:20px}}@media only screen and (max-width: 768px){.row-hero{padding-top:20px;margin-top:0}}.strip-white{background:#fff}.strip-dark{background:#333;color:#fff}.strip-dark a{color:#fff}.strip-trans{background:transparent}.social-list{list-style:none;padding-left:0;margin-left:0}.social-list__item--twitter,.social-list__item--google-plus,.social-list__item--facebook{margin-right:20px;float:left;text-indent:-99999px;background-image:url("https://assets.ubuntu.com/v1/ed986fc0-icon-social.svg");background-repeat:no-repeat;height:44px;width:44px;overflow:hidden;display:inline-block}.social-list__item--twitter:hover,.social-list__item--google-plus:hover,.social-list__item--facebook:hover{background-position-y:-45px}.social-list__item--twitter{background-position:0 0}.social-list__item--google-plus{background-position:-45px 0}.social-list__item--facebook{background-position:-90px 0}@media only screen and (min-width: 768px){.tooltip{position:relative;display:inline-block}.tooltip__content{position:absolute;z-index:98;left:-1000px;right:-1000px;top:-30px;font-weight:300;margin:auto;display:block;text-align:center;white-space:nowrap}.tooltip:hover .tooltip__content:after{display:table;z-index:98;margin:auto;color:#fff;border-radius:3px;background:#000;box-shadow:none;font-size:12px;content:attr(data-tooltip);padding:4px 6px;white-space:nowrap;text-align:center}.tooltip:hover .tooltip__content:before{position:absolute;top:100%;left:50%;margin-left:-5px;content:'';border:solid transparent;border-width:5px;border-top-color:#000}}a,.link{cursor:pointer;color:#f7f7f7;text-decoration:underline}pre{padding:10px 15px;background-color:#333;border:0;border-radius:2px;color:#cdcdcd}html{overflow-y:scroll;overflow-x:hidden;min-height:100%;color:#333;font:1em / 1.5 "'Ubuntu', Arial, 'libra sans', sans-serif"}a{color:#333;text-decoration:none;border-bottom:1px solid #c2c2c2}a:hover{text-decoration:none;color:#dd4814}p,li,code,pre{font-size:16px;font-size:1rem;line-height:1.5;margin-bottom:.75em}pre,code{text-align:left;white-space:pre-line;word-spacing:normal;word-wrap:break-word;tab-size:4;hyphens:none;direction:ltr}hr{margin-bottom:20px}h1,h2,h3,h4,h5{margin:10px 0;font-weight:300;line-height:1.5;color:#333}h1{font-size:2em}h1 small{font-size:75%}h2{font-size:1.4375em}h2 small{font-size:75%}h3{font-size:1.25em}h3 small{font-size:75%}h4{font-size:1em}h4 small{font-size:75%}h5{font-size:0.875em}h5 small{font-size:75%}.gigantic{font-size:45px;font-size:2.8125rem}.mega{font-size:40px;font-size:2.5rem}input[type='text'],input[type='number'],input[type='search'],input[type='password'],input[type='email'],input[type='url'],input[type='tel']{padding:7px 10px;box-shadow:none;width:100%}input[type='text']::placeholder,input[type='number']::placeholder,input[type='search']::placeholder,input[type='password']::placeholder,input[type='email']::placeholder,input[type='url']::placeholder,input[type='tel']::placeholder{color:#888}input[type='text'][disabled],input[type='number'][disabled],input[type='search'][disabled],input[type='password'][disabled],input[type='email'][disabled],input[type='url'][disabled],input[type='tel'][disabled]{color:#888;background-color:transparent}input[type='number']{padding-right:15px}input[type='search']{appearance:textfield}input[type='search']::-webkit-search-decoration,input[type='search']::-webkit-search-cancel-button{appearance:none}input[type='checkbox']{margin:4px 0 0;margin-top:1px 9;line-height:normal}input[type='radio'],input[type='image']{display:inline-block;margin-right:10px}textarea{height:auto;min-height:175px;padding:7px 10px !important;box-shadow:none;width:100%;line-height:20px}textarea::placeholder{color:#888}textarea[disabled]{color:#888;background-color:transparent}select{display:block;clear:both;cursor:pointer;margin:0;background-image:url("../assets/images/forms/chevron-down.svg");background-repeat:no-repeat;background-position:top 14px right 10px;background-color:#fff;padding:7px 30px 7px 10px !important;box-shadow:none;width:100%;-moz-appearance:none;appearance:none;text-indent:.01px;text-overflow:''}select[multiple],select[size]{height:auto;background-image:none;padding-top:10px}select[disabled]{color:#888;background-image:none;background-color:transparent}select:-moz-focusring{color:transparent;text-shadow:0 0 0 #000}select::-ms-expand{display:none}fieldset{background:none;margin-left:0;padding:0}label{display:inline-block;max-width:100%;margin-bottom:5px}[type="checkbox"]:not(:checked),[type="checkbox"]:checked{position:absolute;left:-9999px}[type="checkbox"]+label{height:16px;position:relative;padding-left:25px;cursor:pointer}[type="checkbox"]+label:before{content:'';position:absolute;left:0;top:3px;width:11px;height:11px;border:1px solid #cdcdcd;background:#fff;border-radius:2px}[type="checkbox"]:checked+label:before{background-color:#dd4814;border-color:#dd4814}[type="checkbox"]:checked+label:after{content:'✔';position:absolute;line-height:13px;top:3px;left:3px;font-size:10px;color:#fff;transition:all .2s}@-moz-document url-prefix(){[type="checkbox"]:checked+label:after{font-size:13px;left:1px}}[type="checkbox"][disabled]{cursor:not-allowed}[type="checkbox"][disabled]+label{cursor:not-allowed}[type="checkbox"][disabled]+label:before{opacity:.5}[type="radio"]:not(:checked),[type="radio"]:checked{position:absolute;left:-9999px}[type="radio"]+label{position:relative;padding-left:25px;cursor:pointer}[type="radio"]+label:before{content:'';position:absolute;left:0;top:1px;width:13px;height:13px;border:1px solid #cdcdcd;background:#fff;border-radius:50%}[type="radio"]:checked+label:after{content:'';position:absolute;left:3px;top:4px;width:9px;height:9px;background:#dd4814;border-radius:50%}.tags{width:100%}.tags .tag-list{width:100%;margin:0}.tags .tag-list .tag-item{display:inline-block;float:left;line-height:36px;margin-bottom:0;margin-right:10px;word-wrap:break-word}.tags .tag-list .tag-item .remove-button{border-bottom:0}.tags .input{width:100% !important}.onoffswitch{position:relative;display:inline-block;vertical-align:middle;width:38px;margin:0 0 4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.onoffswitch[disabled] .onoffswitch-checkbox,.onoffswitch[disabled] .onoffswitch-label{opacity:.5;pointer-events:none}.onoffswitch-external-label{display:inline-block;margin-left:5px}.onoffswitch-checkbox{display:none !important}.onoffswitch-label{display:block !important;overflow:hidden;cursor:pointer;border-radius:2px;padding-left:0 !important;margin:0 !important}.onoffswitch-label:before,.onoffswitch-label:after{display:none}.onoffswitch-inner{display:block;width:200%;margin-left:-100%;transition:margin .3s ease-in 0s}.onoffswitch-inner:before,.onoffswitch-inner:after{display:block;float:left;width:50%;height:18px;padding:0;line-height:18px;font-size:14px;color:#fff;font-family:Trebuchet, Arial, sans-serif;font-weight:bold;box-sizing:border-box}.onoffswitch-inner:before{content:'';padding-left:10px;background-color:#38b44a;color:#fff}.onoffswitch-inner:after{content:'';padding-right:10px;background-color:#eee;color:#888;text-align:right}.onoffswitch-switch{display:block;width:19px;height:16px;margin:0;background:#fff;position:absolute;top:0;bottom:0;right:19px;border:1px solid #d2d2d2;border-radius:2px;transition:all .3s ease-in 0s;box-sizing:border-box}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-inner{margin-left:0}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-switch{right:0}dl dt{clear:left;color:#333}dl dd{color:#333;margin-left:0}dl dt,dl dd{display:inline-block;float:left;line-height:36px;margin-bottom:10px !important;word-wrap:break-word}dl dt:last-child,dl dd:last-child{margin-bottom:0}.wrapper{min-height:100%;height:auto !important;height:100%;margin:0 auto;position:relative;background:rgba(255,255,255,0.4)}.wrapper:after{content:'';position:absolute;display:block;top:0;right:0;bottom:0;left:0;background:url("../assets/images/backgrounds/background-paper.png");height:100%;width:100%;z-index:-1}.wrapper--inner{max-width:1440px;width:100%;margin:0 auto;clear:both;display:block}.row{background-color:transparent;border-top:1px dotted #cdcdcd}.row:first-of-type{border-top:0}.button--secondary{line-height:18px}.button--primary:hover,.button--destructive:hover,.button--positive:hover{color:#fff}.button--base:hover,.button--neutral:hover{color:#333}.button--large{height:auto;padding-top:15px;padding-bottom:15px}.button-group{position:relative;width:100%;vertical-align:middle;clear:both;min-width:160px}.button-group.button-group--inline{display:inline-block;width:auto}.button-group .button-group__link{display:inline-block;float:left;text-align:left;padding-right:35px}.button-group .button-group__link::after{content:'';display:inline-block;position:absolute;top:15px;right:15px;width:4px;height:4px;vertical-align:middle;border-right:1px solid;border-bottom:1px solid;transform:rotate(45deg)}.button-group .button-group__dropdown{border-radius:3px;left:0;margin:0;list-style:none;background:#fff;box-shadow:0 1px 1px rgba(0,0,0,0.1);z-index:20;max-height:1000px;transition:max-height .3s ease-in;position:absolute;top:36px;clear:both;min-width:160px}.button-group .button-group__item{float:left;clear:both;padding:5px 10px;margin:0;width:100%}.button-group .button-group__item .button-group__item-link{color:#333;cursor:pointer;width:100%;float:left;margin:0;border:0;text-transform:lowercase;white-space:nowrap}.button-group .button-group__item .button-group__item-link:first-letter{text-transform:uppercase}.button-group .button-group__item .button-group__item-link:hover{color:#dd4814;text-decoration:none}.form .form__group{margin-bottom:10px}.form .form__group .form__group-input{position:relative}.form .form__group .form__group-input .form__group-remove{position:absolute;top:10px;right:10px;cursor:pointer;height:16px;width:16px;background:url("../assets/images/icons/remove.svg") no-repeat;background-size:75% 75%;background-position:center;display:inline-block}.form .form__group .form__group-input .icon,.form .form__group .form__group-input .icon--status-failed,.form .form__group .form__group-input .icon--status-in-progress,.form .form__group .form__group-input .icon--status-queued,.form .form__group .form__group-input .icon--status-succeeded,.form .form__group .form__group-input .icon--status-waiting{position:absolute;top:10px;right:10px;display:inline-block}.form .form__group.form__group--subtle .form__group-label{color:#888}.form .form__group.form__group--subtle input,.form .form__group.form__group--subtle select,.form .form__group.form__group--subtle textarea{border-color:#e3e3e3;background-color:transparent}.form .form__group.form__group--subtle input:hover,.form .form__group.form__group--subtle select:hover,.form .form__group.form__group--subtle textarea:hover{border-color:#cdcdcd;background-color:#fff;outline:none}.form .form__group.form__group--subtle input:active,.form .form__group.form__group--subtle input:focus,.form .form__group.form__group--subtle select:active,.form .form__group.form__group--subtle select:focus,.form .form__group.form__group--subtle textarea:active,.form .form__group.form__group--subtle textarea:focus{border-color:#888;background-color:#fff;outline:none}.form .form__fieldset .form__group:last-of-type{margin-bottom:0}.form .form__siblings{float:left;width:100%;margin-bottom:10px}.form .form__siblings:hover .form__group--subtle input,.form .form__siblings:hover .form__group--subtle select,.form .form__siblings:hover .form__group--subtle textarea{border-color:#cdcdcd;background-color:#fff;outline:none}.form .form__siblings.is-active .form__group--subtle input,.form .form__siblings.is-active .form__group--subtle select,.form .form__siblings.is-active .form__group--subtle textarea{border-color:#cdcdcd;background-color:#fff;outline:none}.form.form--stack .form__group{width:100%;float:left}.form.form--stack .form__group [class*='-col']{margin-bottom:0}.form.form--stack .form__group .form__group-label{margin-top:0;margin-bottom:0;line-height:34px;vertical-align:top}.form.form--stack .form__group .form__group-input{min-height:34px}.form.form--stack .form__group .form__group-input .onoffswitch{margin-top:9px}.form.form--inline .form__fieldset{display:inline-block;width:auto;margin:0;vertical-align:middle}.form.form--inline .form__group{display:inline-block;margin:0 20px 0 0;vertical-align:top}.form.form--inline .form__group .form__group-label{margin-bottom:0;margin-right:10px;vertical-align:top;line-height:34px}.form.form--inline .form__group .form__group-label .icon--left{position:absolute;left:0;top:12px}.form.form--inline .form__group input,.form.form--inline .form__group select,.form.form--inline .form__group .form__group-input{display:inline-block;width:auto;min-height:34px}.form.form--inline .form__group [type='checkbox']+label,.form.form--inline .form__group [type='radio']+label{line-height:34px}.form.form--inline .form__group .onoffswitch{margin:9px 0 0}.form.form--inline .form__group .onoffswitch-external-label{margin:0;vertical-align:middle;line-height:34px}.form .form__help-text{font-size:14px;font-size:0.875rem;color:#888}.form__error{margin:0;color:#df382c}.form__error .form__error-item{margin:6px 0}.code-block{overflow:auto;margin:.5em 0;padding:1em;border:1px solid #cdcdcd;border-radius:.5em}.code-block .code-block__line{float:left;clear:both;margin:0}.code-block.code-block--terminal{color:#fff;border:0;background-color:#333}.code-block.code-block--numbering{counter-reset:line-numbering}.code-block.code-block--numbering .code-block__line::before{width:1.5em;padding-right:1em;content:counter(line-numbering);counter-increment:line-numbering;user-select:none;text-align:right;pointer-events:none;opacity:.5}.flash-messages{width:100%;float:left;margin:0}.flash-messages .flash-messages__item{box-sizing:border-box;border-radius:2px;list-style:none;padding:15px 20px;margin:0 0 20px;background:#fff;background-position:top 50% left 15px;background-repeat:no-repeat;box-shadow:0 1px 1px rgba(0,0,0,0.1)}.flash-messages .flash-messages__item:last-of-type{margin-bottom:0}.flash-messages .flash-messages__item.flash-messages__item--error{background:#fff url("../assets/images/icons/error.svg") no-repeat;background-size:16px 16px;background-position:15px center;padding-left:45px}.flash-messages .flash-messages__item.flash-messages__item--info{background:#fff url("../assets/images/icons/info.svg") no-repeat;background-size:16px 16px;background-position:15px center;padding-left:45px}.flash-messages .flash-messages__item.flash-messages__item--warning{background:#fff url("../assets/images/icons/warning.svg") no-repeat;background-size:16px 16px;background-position:15px center;padding-left:45px}.flash-messages .flash-messages__item.flash-messages__item--success{background:#fff url("../assets/images/icons/success.svg") no-repeat;background-size:16px 16px;background-position:15px center;padding-left:45px}.icon,.icon--status-failed,.icon--status-in-progress,.icon--status-queued,.icon--status-succeeded,.icon--status-waiting{width:16px;height:16px;padding:0;border-bottom:0 !important;display:inline-block;vertical-align:middle;text-indent:999em}.icon.icon--add,.icon--add.icon--status-failed,.icon--add.icon--status-in-progress,.icon--add.icon--status-queued,.icon--add.icon--status-succeeded,.icon--add.icon--status-waiting{background:url("../assets/images/icons/add.svg") no-repeat;background-size:100% 100%}.icon.icon--account,.icon--account.icon--status-failed,.icon--account.icon--status-in-progress,.icon--account.icon--status-queued,.icon--account.icon--status-succeeded,.icon--account.icon--status-waiting{background:url("../assets/images/icons/account.svg") no-repeat;background-size:100% 100%}.icon.icon--cross,.icon--cross.icon--status-failed,.icon--cross.icon--status-in-progress,.icon--cross.icon--status-queued,.icon--cross.icon--status-succeeded,.icon--cross.icon--status-waiting{background:url("../assets/images/icons/cross.svg") no-repeat;background-size:100% 100%}.icon.icon--cross-orange,.icon--cross-orange.icon--status-failed,.icon--cross-orange.icon--status-in-progress,.icon--cross-orange.icon--status-queued,.icon--cross-orange.icon--status-succeeded,.icon--cross-orange.icon--status-waiting{background:url("../assets/images/icons/cross-orange.svg") no-repeat;background-size:100% 100%}.icon.icon--debug,.icon--debug.icon--status-failed,.icon--debug.icon--status-in-progress,.icon--debug.icon--status-queued,.icon--debug.icon--status-succeeded,.icon--debug.icon--status-waiting{background:url("../assets/images/icons/debug.svg") no-repeat;background-size:100% 100%}.icon.icon--delete,.icon--delete.icon--status-failed,.icon--delete.icon--status-in-progress,.icon--delete.icon--status-queued,.icon--delete.icon--status-succeeded,.icon--delete.icon--status-waiting{background:url("../assets/images/icons/delete.svg") no-repeat;background-size:100% 100%}.icon.icon--edit,.icon--edit.icon--status-failed,.icon--edit.icon--status-in-progress,.icon--edit.icon--status-queued,.icon--edit.icon--status-succeeded,.icon--edit.icon--status-waiting{background:url("../assets/images/icons/edit.svg") no-repeat;background-size:100% 100%}.icon.icon--error,.icon--error.icon--status-failed,.icon--error.icon--status-in-progress,.icon--error.icon--status-queued,.icon--error.icon--status-succeeded,.icon--error.icon--status-waiting{background:url("../assets/images/icons/error.svg") no-repeat;background-size:100% 100%}.icon.icon--help,.icon--help.icon--status-failed,.icon--help.icon--status-in-progress,.icon--help.icon--status-queued,.icon--help.icon--status-succeeded,.icon--help.icon--status-waiting{background:url("../assets/images/icons/help.svg") no-repeat;background-size:100% 100%}.icon.icon--info,.icon--info.icon--status-failed,.icon--info.icon--status-in-progress,.icon--info.icon--status-queued,.icon--info.icon--status-succeeded,.icon--info.icon--status-waiting{background:url("../assets/images/icons/info.svg") no-repeat;background-size:100% 100%}.icon.icon--loading,.icon--loading.icon--status-failed,.icon--loading.icon--status-in-progress,.icon--loading.icon--status-queued,.icon--loading.icon--status-succeeded,.icon--loading.icon--status-waiting{background:url("../assets/images/icons/loading.png") no-repeat;background-size:100% 100%}.icon.icon--mount,.icon--mount.icon--status-failed,.icon--mount.icon--status-in-progress,.icon--mount.icon--status-queued,.icon--mount.icon--status-succeeded,.icon--mount.icon--status-waiting{background:url("../assets/images/icons/mount.svg") no-repeat;background-size:100% 100%}.icon.icon--unmount,.icon--unmount.icon--status-failed,.icon--unmount.icon--status-in-progress,.icon--unmount.icon--status-queued,.icon--unmount.icon--status-succeeded,.icon--unmount.icon--status-waiting{background:url("../assets/images/icons/unmount.svg") no-repeat;background-size:100% 100%}.icon.icon--partition,.icon--partition.icon--status-failed,.icon--partition.icon--status-in-progress,.icon--partition.icon--status-queued,.icon--partition.icon--status-succeeded,.icon--partition.icon--status-waiting{background:url("../assets/images/icons/partition.svg") no-repeat;background-size:100% 100%}.icon.icon--power-error,.icon--power-error.icon--status-failed,.icon--power-error.icon--status-in-progress,.icon--power-error.icon--status-queued,.icon--power-error.icon--status-succeeded,.icon--power-error.icon--status-waiting{background:url("../assets/images/icons/power-error.svg") no-repeat;background-size:100% 100%}.icon.icon--power-off,.icon--power-off.icon--status-failed,.icon--power-off.icon--status-in-progress,.icon--power-off.icon--status-queued,.icon--power-off.icon--status-succeeded,.icon--power-off.icon--status-waiting{background:url("../assets/images/icons/power-off.svg") no-repeat;background-size:100% 100%}.icon.icon--power-on,.icon--power-on.icon--status-failed,.icon--power-on.icon--status-in-progress,.icon--power-on.icon--status-queued,.icon--power-on.icon--status-succeeded,.icon--power-on.icon--status-waiting{background:url("../assets/images/icons/power-on.svg") no-repeat;background-size:100% 100%}.icon.icon--remove,.icon--remove.icon--status-failed,.icon--remove.icon--status-in-progress,.icon--remove.icon--status-queued,.icon--remove.icon--status-succeeded,.icon--remove.icon--status-waiting{background:url("../assets/images/icons/remove.svg") no-repeat;background-size:100% 100%}.icon.icon--success,.icon--success.icon--status-failed,.icon--success.icon--status-in-progress,.icon--success.icon--status-queued,.icon--success.icon--status-succeeded,.icon--success.icon--status-waiting{background:url("../assets/images/icons/success.svg") no-repeat;background-size:100% 100%}.icon.icon--success-mono,.icon--success-mono.icon--status-failed,.icon--success-mono.icon--status-in-progress,.icon--success-mono.icon--status-queued,.icon--success-mono.icon--status-succeeded,.icon--success-mono.icon--status-waiting{background:url("../assets/images/icons/success-mono.svg") no-repeat;background-size:100% 100%}.icon.icon--success-grey,.icon--success-grey.icon--status-failed,.icon--success-grey.icon--status-in-progress,.icon--success-grey.icon--status-queued,.icon--success-grey.icon--status-succeeded,.icon--success-grey.icon--status-waiting{background:url('data:image/svg+xml;utf8, <svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="success"><rect id="rect6708" x="0" y="9.99999989e-06" width="16" height="16"></rect><circle id="circle6710" stroke="#888" stroke-width="1.5" fill="#888" cx="8" cy="8.00001" r="7.2500086"></circle><polygon id="path6712" fill="#fff" points="11.80029 4.92345 11.73439 4.98115 6.99964 9.12837 4.22407 6.74743 3.38501 7.69631 7.00033 11.50002 12.5 5.71278 11.80029 4.92349"></polygon></g></g></svg>');background-size:100% 100%}.icon.icon--settings,.icon--settings.icon--status-failed,.icon--settings.icon--status-in-progress,.icon--settings.icon--status-queued,.icon--settings.icon--status-succeeded,.icon--settings.icon--status-waiting{background:url("../assets/images/icons/settings.svg") no-repeat;background-size:100% 100%}.icon.icon--sync,.icon--sync.icon--status-failed,.icon--sync.icon--status-in-progress,.icon--sync.icon--status-queued,.icon--sync.icon--status-succeeded,.icon--sync.icon--status-waiting{background:url("../assets/images/icons/sync.svg") no-repeat;background-size:100% 100%}.icon.icon--search,.icon--search.icon--status-failed,.icon--search.icon--status-in-progress,.icon--search.icon--status-queued,.icon--search.icon--status-succeeded,.icon--search.icon--status-waiting{background:url("../assets/images/icons/magnifying_glass.svg") no-repeat;background-size:100% 100%}.icon.icon--system-shutdown,.icon--system-shutdown.icon--status-failed,.icon--system-shutdown.icon--status-in-progress,.icon--system-shutdown.icon--status-queued,.icon--system-shutdown.icon--status-succeeded,.icon--system-shutdown.icon--status-waiting{background:url("../assets/images/icons/system-shutdown.svg") no-repeat;background-size:100% 100%}.icon.icon--tooltip,.icon--tooltip.icon--status-failed,.icon--tooltip.icon--status-in-progress,.icon--tooltip.icon--status-queued,.icon--tooltip.icon--status-succeeded,.icon--tooltip.icon--status-waiting{background:url("../assets/images/icons/tooltip.svg") no-repeat;background-size:100% 100%}.icon.icon--tags,.icon--tags.icon--status-failed,.icon--tags.icon--status-in-progress,.icon--tags.icon--status-queued,.icon--tags.icon--status-succeeded,.icon--tags.icon--status-waiting{background:url("../assets/images/icons/tags.svg") no-repeat;background-size:100% 100%}.icon.icon--tick,.icon--tick.icon--status-failed,.icon--tick.icon--status-in-progress,.icon--tick.icon--status-queued,.icon--tick.icon--status-succeeded,.icon--tick.icon--status-waiting{background:url("../assets/images/icons/tick.svg") no-repeat;background-size:100% 100%}.icon.icon--logical-volume,.icon--logical-volume.icon--status-failed,.icon--logical-volume.icon--status-in-progress,.icon--logical-volume.icon--status-queued,.icon--logical-volume.icon--status-succeeded,.icon--logical-volume.icon--status-waiting{background:url("../assets/images/icons/logical-volume.svg") no-repeat;background-size:100% 100%}.icon.icon--warning,.icon--warning.icon--status-failed,.icon--warning.icon--status-in-progress,.icon--warning.icon--status-queued,.icon--warning.icon--status-succeeded,.icon--warning.icon--status-waiting{background:url("../assets/images/icons/warning.svg") no-repeat;background-size:100% 100%}.icon.icon--warning-mono,.icon--warning-mono.icon--status-failed,.icon--warning-mono.icon--status-in-progress,.icon--warning-mono.icon--status-queued,.icon--warning-mono.icon--status-succeeded,.icon--warning-mono.icon--status-waiting{background:url("../assets/images/icons/warning-mono.svg") no-repeat}.icon.icon--open,.icon--open.icon--status-failed,.icon--open.icon--status-in-progress,.icon--open.icon--status-queued,.icon--open.icon--status-succeeded,.icon--open.icon--status-waiting{background:url("../assets/images/forms/chevron-down.svg") no-repeat;background-size:10px 4px;background-position:center 4px}.icon.icon--close,.icon--close.icon--status-failed,.icon--close.icon--status-in-progress,.icon--close.icon--status-queued,.icon--close.icon--status-succeeded,.icon--close.icon--status-waiting{background:url("../assets/images/forms/chevron-up.svg") no-repeat;background-size:10px 4px;background-position:center 4px}.icon--status-failed{content:url('data:image/svg+xml;utf8, <svg width="16px" height="16px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="status-queued" transform="translate(1, 1)"><g id="Page-1"><g id="status-queued"><g id="Group"><circle id="Oval" stroke="#ed3146" stroke-width="2" cx="6" cy="6" r="6"></circle><circle id="Oval-Copy" class="status-circle" fill="#ed3146" cx="6" cy="6" r="4"></circle></g></g></g></g></g></svg>')}.icon--status-in-progress{content:url('data:image/svg+xml;utf8, <svg width="16px" height="16px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="status-queued" transform="translate(1, 1)"><g id="Page-1"><g id="status-queued"><g id="Group"><circle id="Oval" stroke="#19b6ee" stroke-width="2" cx="6" cy="6" r="6"></circle><circle id="Oval-Copy" class="status-circle" fill="#19b6ee" cx="6" cy="6" r="4"></circle></g></g></g></g></g></svg>')}.icon--status-queued{content:url('data:image/svg+xml;utf8, <svg width="16px" height="16px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="status-queued" transform="translate(1, 1)"><g id="Page-1"><g id="status-queued"><g id="Group"><circle id="Oval" stroke="#888" stroke-width="2" cx="6" cy="6" r="6"></circle><circle id="Oval-Copy" class="status-circle" fill="#888" cx="6" cy="6" r="4"></circle></g></g></g></g></g></svg>')}.icon--status-succeeded{content:url('data:image/svg+xml;utf8, <svg width="16px" height="16px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="status-queued" transform="translate(1, 1)"><g id="Page-1"><g id="status-queued"><g id="Group"><circle id="Oval" stroke="#3eb34f" stroke-width="2" cx="6" cy="6" r="6"></circle><circle id="Oval-Copy" class="status-circle" fill="#3eb34f" cx="6" cy="6" r="4"></circle></g></g></g></g></g></svg>')}.icon--status-waiting{content:url('data:image/svg+xml;utf8, <svg width="16px" height="16px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="status-queued" transform="translate(1, 1)"><g id="Page-1"><g id="status-queued"><g id="Group"><circle id="Oval" stroke="#f99b0f" stroke-width="2" cx="6" cy="6" r="6"></circle><circle id="Oval-Copy" class="status-circle" fill="#f99b0f" cx="6" cy="6" r="4"></circle></g></g></g></g></g></svg>')}.icon--small{width:14px;height:14px}.icon--large{width:20px;height:20px}.icon--mega{width:23px;height:23px}.icon--gigantic{width:32px;height:32px}h1 .icon,h1 .icon--status-failed,h1 .icon--status-in-progress,h1 .icon--status-queued,h1 .icon--status-succeeded,h1 .icon--status-waiting{margin-top:-6px}h2 .icon,h2 .icon--status-failed,h2 .icon--status-in-progress,h2 .icon--status-queued,h2 .icon--status-succeeded,h2 .icon--status-waiting,h3 .icon,h3 .icon--status-failed,h3 .icon--status-in-progress,h3 .icon--status-queued,h3 .icon--status-succeeded,h3 .icon--status-waiting{margin-top:-5px}h4 .icon,h4 .icon--status-failed,h4 .icon--status-in-progress,h4 .icon--status-queued,h4 .icon--status-succeeded,h4 .icon--status-waiting,h5 .icon,h5 .icon--status-failed,h5 .icon--status-in-progress,h5 .icon--status-queued,h5 .icon--status-succeeded,h5 .icon--status-waiting,p .icon,p .icon--status-failed,p .icon--status-in-progress,p .icon--status-queued,p .icon--status-succeeded,p .icon--status-waiting,label .icon,label .icon--status-failed,label .icon--status-in-progress,label .icon--status-queued,label .icon--status-succeeded,label .icon--status-waiting,button .icon,button .icon--status-failed,button .icon--status-in-progress,button .icon--status-queued,button .icon--status-succeeded,button .icon--status-waiting,a .icon,a .icon--status-failed,a .icon--status-in-progress,a .icon--status-queued,a .icon--status-succeeded,a .icon--status-waiting,th .icon,th .icon--status-failed,th .icon--status-in-progress,th .icon--status-queued,th .icon--status-succeeded,th .icon--status-waiting,td .icon,td .icon--status-failed,td .icon--status-in-progress,td .icon--status-queued,td .icon--status-succeeded,td .icon--status-waiting,.table__header .icon,.table__header .icon--status-failed,.table__header .icon--status-in-progress,.table__header .icon--status-queued,.table__header .icon--status-succeeded,.table__header .icon--status-waiting,.table__data .icon,.table__data .icon--status-failed,.table__data .icon--status-in-progress,.table__data .icon--status-queued,.table__data .icon--status-succeeded,.table__data .icon--status-waiting{margin-top:-3px}.list__tree{list-style:none;border-left:1px solid #d2d2d2;position:relative}.list__tree.list__tree--sub-level{margin-top:10px;margin-left:20px;clear:both}.list__tree.list__tree--sub-level .list__item .list__item-feedback{left:180px}.list__tree .list__item{list-style:none}.list__tree .list__item:before{content:'';width:12px;height:1px;background:#d2d2d2;display:inline-block;position:relative;top:-4px;margin-right:5px}.list__tree .list__item:last-child::after{content:'';width:4px;height:1em;position:absolute;display:block;left:-2px;bottom:-6px;background:#fafafa}.list__tree .list__item .list__item-feedback{position:relative;left:200px;margin-top:-24px}table,.table{border-color:#d2d2d2;border-spacing:0;overflow-x:scroll;margin:0 0 20px;width:100%;text-align:left;border-collapse:separate}table tr,.table table tr,table .table tr,.table .table__row{width:100%;border-color:#b2b2b2;border-bottom-style:dotted;border-bottom-width:1px}table th,.table table th,table .table th,table td,.table table td,table .table td,.table .table__header,.table .table__data{font-size:16px;font-size:1rem;padding:10px;box-sizing:border-box;min-height:21px;background:none;border:0;text-align:left;border-collapse:separate;vertical-align:top;backface-visibility:hidden;position:relative}table thead tr,.table table thead tr,table thead .table tr,.table .table__head .table__row{color:#888;border-bottom:1px solid}table thead tr:hover,.table .table__head .table__row:hover{background-color:transparent}table thead th,.table table thead th,table thead .table th,.table .table__head .table__header{font-size:13px;font-size:0.8125rem;background:none;color:#888;font-size:13px}table thead th input[type="radio"]+label,.table .table__head .table__header input[type="radio"]+label,table thead th input[type="checkbox"]+label,.table .table__head .table__header input[type="checkbox"]+label{margin:0;top:-3px}table thead th a:link,table thead th a:visited,.table .table__head .table__header .table__header-link{color:#888;border-bottom:0}table thead th a:hover:link,table thead th a:hover:visited,.table .table__head .table__header .table__header-link:hover{color:#333;text-decoration:none}table thead th a.is-active:link,table thead th a.is-active:visited,.table .table__head .table__header .is-active.table__header-link{color:#333;text-decoration:none}table thead th a.is-sorted:link,table thead th a.is-sorted:visited,.table .table__head .table__header .is-sorted.table__header-link{border-bottom:1px solid #333}table thead .divide,.table .table__head .table__header-divide,.table .table__head .divide{width:1px;display:inline-block;background:#888;height:10px;margin:0 5px}table .numerical,.table .numerical{text-align:right}table input[type="radio"]+label,.table input[type="radio"]+label,table input[type="checkbox"]+label,.table input[type="checkbox"]+label{margin:0;top:-1px}table th{color:#888;border-bottom:1px solid}table td{border-color:#b2b2b2;border-bottom-style:dotted;border-bottom-width:1px}table td a:link,table td a:visited{color:#333;border-bottom:1px solid #c2c2c2}table td a:link:hover,table td a:visited:hover{text-decoration:none;color:#dd4814}table thead{width:100% !important;display:table-header-group !important}table thead.table__head--sticky{background:#fff;padding:0;width:100vw !important;left:0 !important;right:0 !important;height:auto}table thead.table__head--sticky tr{max-width:1440px;width:100%;margin:0 auto;display:block;float:none;border-bottom:0;overflow:hidden}table thead.table__head--sticky tr th{border-bottom:0;float:left}.table{display:table}.table .table__row{float:left;display:table-row}.table .table__row:hover{background-color:#fff}.table .table__row:hover .table__controls{z-index:1;opacity:1}.table .table__row:hover .table__controls--secondary{z-index:1;opacity:1}.table .table__row.is-active{background-color:#fff}.table .table__row.is-active .table__controls{z-index:1;opacity:1}.table .table__row.is-active .table__controls--secondary{z-index:1;opacity:1}.table .table__row.is-active .table__dropdown .table__row{display:none}.table .table__row.is-active .table__dropdown .table__row.is-active{display:block}.table .table__header,.table .table__data{display:table-cell;float:left}.table .table__data a:link,.table .table__data a:visited{color:#333;border-bottom:1px solid #c2c2c2}.table .table__data a:link:hover,.table .table__data a:visited:hover{text-decoration:none;color:#dd4814}.table .table__head{display:table-head;width:100%;box-sizing:border-box;width:auto !important}.table .table__head.table__head--sticky{background:#fff;padding:0;width:100vw !important;left:0 !important;right:0 !important;border-top:1px dotted #d2d2d2;box-shadow:0 1px 1px rgba(0,0,0,0.1);height:auto !important}.table .table__head.table__head--sticky .table__row{max-width:1440px;width:100%;margin:0 auto;display:block;float:none;border-bottom:0;overflow:hidden}.table .table__body{display:table-row-group}.table .table__footer{display:table-footer-group}.table .table__label{clear:both;display:block;margin-top:5px;line-height:16px;color:#bcbcbc}.table .table__label a{color:#bcbcbc}.table .table__label a:hover{color:#f7f7f7}.table .table__label.is-active a{color:#f7f7f7}.table .table__controls{width:100%;text-align:right;opacity:0;z-index:-1000}.table .table__controls--secondary{opacity:0;z-index:-1000;width:auto;text-align:left}.table .table__controls a,.table .table__controls a:link,.table .table__controls a:visited{color:#333;border-bottom:1px solid #c2c2c2}.table .table__controls a:hover,.table .table__controls a:link:hover,.table .table__controls a:visited:hover{text-decoration:none;color:#dd4814}.table .table__input{display:inline-block;background-color:#fff;border-color:#d2d2d2;background-position:right 10px top 16px;margin:-7px 0}.table .table__input[disabled]{background-color:transparent;border-color:transparent;pointer-events:none;background-position:-9999px -9999px;color:#333}.table .table__dropdown{width:100%}.table .table__dropdown .table__row{border-bottom:0;display:none;position:relative}.table .table__dropdown .table__row--indent{padding-left:41px !important;float:left;width:100%;box-sizing:border-box}.table .table__dropdown .table__row:before{display:block;margin:0 auto;width:calc(100% - 20px);border-top:1px dotted #d2d2d2;position:absolute;height:1px;content:'';top:0;left:10px}.table .table__dropdown .table__row.table__row--head{border-bottom:0}.table .table__dropdown .table__row.table__row--head .table__header{color:#bcbcbc;font-size:13px}.table .table__dropdown .table__row.u-border--none:before{display:none}.table .table__dropdown .table__row.u-border:before{display:block;margin:0 auto;width:calc(100% - 20px);border-top:1px dotted #d2d2d2;position:absolute;height:1px;content:'';top:0;left:10px}.table .table__dropdown .table__row.is-active .table__input{background-color:#fff;border-color:#d2d2d2;background-position:right 10px top 16px;pointer-events:all}.table .table__dropdown .table__row.is-active .table__input[disabled]{border-color:transparent;cursor:pointer}.table .table__dropdown--info .table__row{border-bottom:0}.table .table__dropdown--info .table__data{color:#bcbcbc}.form .form__group input,.form .form__group select{margin:0}.table--error{border-color:#df382c}.table--error .table__header,.table--error .table__data,.table--error th,.table--error td{border-color:#df382c;background-color:#fadfdd}.table--warning{border-color:#eca918}.table--warning .table__header,.table--warning .table__data,.table--warning th,.table--warning td{border-color:#eca918;background-color:#fcefd4}.table--success{border-color:#38b44a}.table--success .table__header,.table--success .table__data,.table--success th,.table--success td{border-color:#38b44a;background-color:#caeecf}.table--information{border-color:#19b6ee}.table--information .table__header,.table--information .table__data,.table--information th,.table--information td{border-color:#19b6ee;background-color:#d7f2fc}.table-col--1{width:1%}.table-col--2{width:2%}.table-col--3{width:3%}.table-col--4{width:4%}.table-col--5{width:5%}.table-col--6{width:6%}.table-col--7{width:7%}.table-col--8{width:8%}.table-col--9{width:9%}.table-col--10{width:10%}.table-col--11{width:11%}.table-col--12{width:12%}.table-col--13{width:13%}.table-col--14{width:14%}.table-col--15{width:15%}.table-col--16{width:16%}.table-col--17{width:17%}.table-col--18{width:18%}.table-col--19{width:19%}.table-col--20{width:20%}.table-col--21{width:21%}.table-col--22{width:22%}.table-col--23{width:23%}.table-col--24{width:24%}.table-col--25{width:25%}.table-col--26{width:26%}.table-col--27{width:27%}.table-col--28{width:28%}.table-col--29{width:29%}.table-col--30{width:30%}.table-col--31{width:31%}.table-col--32{width:32%}.table-col--33{width:33%}.table-col--34{width:34%}.table-col--35{width:35%}.table-col--36{width:36%}.table-col--37{width:37%}.table-col--38{width:38%}.table-col--39{width:39%}.table-col--40{width:40%}.table-col--41{width:41%}.table-col--42{width:42%}.table-col--43{width:43%}.table-col--44{width:44%}.table-col--45{width:45%}.table-col--46{width:46%}.table-col--47{width:47%}.table-col--48{width:48%}.table-col--49{width:49%}.table-col--50{width:50%}.table-col--51{width:51%}.table-col--52{width:52%}.table-col--53{width:53%}.table-col--54{width:54%}.table-col--55{width:55%}.table-col--56{width:56%}.table-col--57{width:57%}.table-col--58{width:58%}.table-col--59{width:59%}.table-col--60{width:60%}.table-col--61{width:61%}.table-col--62{width:62%}.table-col--63{width:63%}.table-col--64{width:64%}.table-col--65{width:65%}.table-col--66{width:66%}.table-col--67{width:67%}.table-col--68{width:68%}.table-col--69{width:69%}.table-col--70{width:70%}.table-col--71{width:71%}.table-col--72{width:72%}.table-col--73{width:73%}.table-col--74{width:74%}.table-col--75{width:75%}.table-col--76{width:76%}.table-col--77{width:77%}.table-col--78{width:78%}.table-col--79{width:79%}.table-col--80{width:80%}.table-col--81{width:81%}.table-col--82{width:82%}.table-col--83{width:83%}.table-col--84{width:84%}.table-col--85{width:85%}.table-col--86{width:86%}.table-col--87{width:87%}.table-col--88{width:88%}.table-col--89{width:89%}.table-col--90{width:90%}.table-col--91{width:91%}.table-col--92{width:92%}.table-col--93{width:93%}.table-col--94{width:94%}.table-col--95{width:95%}.table-col--96{width:96%}.table-col--97{width:97%}.table-col--98{width:98%}.table-col--99{width:99%}.table-col--100{width:100%}.tabs{display:inline-block}.tabs .tabs__tab{font-size:18px;font-size:1.125rem;display:inline-block;list-style-type:none}.tabs .tabs__tab .tabs__tab-link{color:#888;text-decoration:none;border-bottom:0}.tabs .tabs__tab:hover .tabs__tab-link{border-bottom:3px solid #888}.tabs .tabs__tab:after{content:'';width:1px;display:inline-block;background:#d2d2d2;height:11px;padding:0;margin:0 5px}.tabs .tabs__tab:last-child::after{display:none}.tabs .is-active .tabs__tab-link,.tabs .is-active:hover .tabs__tab-link{border-bottom:3px solid #dd4814}.tooltip{position:relative}.tooltip::before{position:absolute;left:50%;transform:translateX(-50%) translateY(-14px);content:'';width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;z-index:-1;border-top:5px solid #333;opacity:0;visibility:hidden;bottom:100%;margin-bottom:-11px}.tooltip::after{content:attr(aria-label);font-size:13px;font-weight:400;line-height:16px;position:absolute;z-index:-1;left:50%;bottom:100%;transform:translateX(-50%) translateY(-8px);background:#333;color:#fff;padding:10px;height:auto;text-indent:0;opacity:0;visibility:hidden;border-radius:5px;box-shadow:0 1px 3px 0 rgba(51,51,51,0.2);white-space:pre;box-sizing:border-box;font-style:normal}.tooltip:hover::after,.tooltip:hover::before{opacity:1 !important;z-index:1000;visibility:visible}.tooltip.tooltip--right::before{border-top:5px solid transparent;border-right:5px solid #333;border-bottom:5px solid transparent;left:100%;bottom:inherit;top:50%;transform:translateX(4px) translateY(-50%)}.tooltip.tooltip--right::after{left:100%;bottom:inherit;top:50%;margin-bottom:-14px;transform:translateX(14px) translateY(-50%)}.tooltip.tooltip--bottom::before{border-top:0;border-right:5px solid transparent;border-bottom:5px solid #333;border-left:5px solid transparent;left:50%;bottom:inherit;top:100%;transform:translateX(-50%) translateY(8px)}.tooltip.tooltip--bottom::after{left:50%;bottom:inherit;top:100%;margin-bottom:0;transform:translateX(-50%) translateY(13px)}.tooltip.tooltip--left::before{border-top:5px solid transparent;border-left:5px solid #333;border-bottom:5px solid transparent;left:-4px;bottom:inherit;top:50%;transform:translateX(-100%) translateY(-50%)}.tooltip.tooltip--left::after{left:-14px;bottom:inherit;top:50%;margin-bottom:-14px;transform:translateX(-100%) translateY(-50%)}.accordion{box-sizing:border-box;border-radius:2px;list-style:none;background:#fff;box-shadow:0 1px 1px rgba(0,0,0,0.1);margin-bottom:40px}.accordion.is-disabled{opacity:.5;pointer-events:none}.accordion .accordion__title{font-size:20px;font-size:1.25rem;border-bottom:1px dotted #b2b2b2;padding:8px 20px 9px;margin:0}.accordion .accordion__tab{border-bottom:1px dotted #b2b2b2}.accordion .accordion__tab:last-of-type{border:0}.accordion .accordion__tab .accordion__tab-title.is-active{background-image:url("../assets/images/forms/chevron_up.svg")}.accordion .accordion__tab .accordion__tab-title.is-active+.accordion__tab-content{max-height:400px;transition:max-height .5s ease-in}.accordion .accordion__tab .accordion__tab-content{max-height:0;transition:max-height .5s ease-out;overflow:hidden;overflow:auto}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list{list-style-type:none;padding:0 20px 14px;margin:0}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item{margin-bottom:.15em}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item .accordion__tab-link{box-sizing:border-box;color:#333;width:100%;display:inline-block;padding-right:20px;border-bottom:0;outline:0}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item .accordion__tab-link:hover{color:#dd4814;text-decoration:none}.disabled .accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item .accordion__tab-link{color:#333}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item.is-active{margin-bottom:.15em;font-weight:400}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item.is-active .accordion__tab-link{background:transparent url("../assets/images/icons/cross.svg") top 7px right 0 no-repeat;text-decoration:none}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item.is-active:hover{color:#f7f7f7}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item.is-active:hover .accordion__tab-link{color:#dd4814;background-image:url("../assets/images/icons/cross_orange.svg")}.accordion .accordion__tab .accordion__tab-title,.accordion .accordion__tab .accordion__tab-title.is-active{padding:12px 20px;margin:0;color:#888;cursor:pointer;background:transparent url("../assets/images/forms/chevron_down.svg") top 20px right 20px no-repeat}.action-card{background:#fff;box-shadow:0 1px 1px rgba(0,0,0,0.1);margin-bottom:40px;padding:20px 20px 10px;box-sizing:border-box;width:100%;display:inline-block;clear:both}.action-card .action-card__title{font-size:23px;margin-bottom:20px}.action-card .action-card__controls{border-top:1px dotted #888;width:100%;display:inline-block;margin:10px 0 0;padding:10px 0 0;box-sizing:border-box}.banner{background-color:#000}@media only screen and (min-width: 620px){.banner{box-shadow:none}.banner .nav-primary{max-width:none}.banner .nav-primary .logo{height:auto;margin-top:12px}.banner .nav-primary .logo a{border-bottom:0}.banner .nav-primary ul li{border-left:1px solid #333}.banner .nav-primary ul li:last-child{border-right:1px solid #333;border-left:1px solid #333}.banner .nav-primary ul li a,.banner .nav-primary ul li a:link,.banner .nav-primary ul li a:visited{box-sizing:border-box;border-bottom:0;border-left:0}.banner .nav-primary ul li a:hover,.banner .nav-primary ul li a:link:hover,.banner .nav-primary ul li a:visited:hover{background-color:rgba(51,51,51,0.9)}.banner .nav-primary ul li a.active,.banner .nav-primary ul li a:link.active,.banner .nav-primary ul li a:visited.active{background-color:transparent;box-shadow:inset 0px -3px #dd4814}.banner .nav-primary ul li a.active:hover,.banner .nav-primary ul li a:link.active:hover,.banner .nav-primary ul li a:visited.active:hover{background-color:rgba(51,51,51,0.9)}}.page-header{box-sizing:border-box;background:#fff;box-shadow:0 1px 1px rgba(0,0,0,0.1);padding:0 20px;height:auto !important;width:100%;float:left;margin-bottom:20px}.page-header .page-header__title{font-size:32px;font-size:2rem;margin:0;padding:34px 0;display:inline-block}.page-header .page-header__title [contenteditable="true"]{font-size:32px;font-size:2rem;padding:8px 10px;width:auto;box-sizing:border-box;border:1px solid transparent;margin:-20px 0 -20px -10px;border-radius:2px;color:#333;cursor:default;display:inline-block}.page-header .page-header__title [contenteditable="true"].editmode,.page-header .page-header__title [contenteditable="true"].editable:hover{border:1px solid #D2D2D2;cursor:text}.page-header .page-header__title [contenteditable="true"].editmode:hover,.page-header .page-header__title [contenteditable="true"]:active,.page-header .page-header__title [contenteditable="true"]:focus{outline:none;background-color:#fff;border:1px solid #B2B2B2}.page-header .page-header__title [contenteditable="true"].invalid,.page-header .page-header__title [contenteditable="true"].invalid:hover,.page-header .page-header__title [contenteditable="true"].invalid:active,.page-header .page-header__title [contenteditable="true"].invalid:focus{border-color:#df382c}.page-header .page-header__title .page-header__title-dot{display:inline-block;width:auto;padding:0}.page-header .page-header__title .page-header__title-domain{font-size:32px;font-size:2rem;display:inline-block;width:auto;min-height:66px;max-height:66px;line-height:25px;margin:-20px 0;background-position:top 32px right 10px;padding:13px 10px !important}.page-header .page-header__status{font-size:19px;font-size:1.1875rem;width:auto;display:inline-block;position:relative;margin-left:20px;color:#888}.page-header .page-header__status .page-header__status-check{font-size:16px;font-size:1rem;margin-left:10px;color:inherit;border:0}.page-header .page-header__status .page-header__status-check:hover{text-decoration:underline}.page-header .page-header__controls{padding:40px 0;display:inline-block;float:right}.page-header .page-header__controls .page-header__controls-feedback{color:#333;text-decoration:none;border-bottom:1px solid #c2c2c2}.page-header .page-header__controls .page-header__controls-feedback:hover{text-decoration:none;color:#dd4814;cursor:pointer}.page-header .page-header__dropdown{max-height:0;overflow:hidden;-webkit-transition:max-height 0.3s ease;-moz-transition:max-height 0.3s ease;transition:max-height 0.3s ease}.page-header .page-header__dropdown.is-open{max-height:1000px}.page-header .page-header__dropdown .page-header__section{border-top:1px dotted #888;padding-top:20px;padding-bottom:20px}.page-header .page-header__dropdown .page-header__message{width:auto;display:inline-block;float:none;margin:0 20px 0 0;line-height:36px}.page-header .page-header__dropdown .page-header__message--error{background:url("../assets/images/icons/error.svg") no-repeat;background-size:16px 16px;background-position:0 10px;padding-left:25px}.page-header .page-header__dropdown .page-header__message--info{background:url("../assets/images/icons/info.svg") no-repeat;background-size:16px 16px;background-position:0 10px;padding-left:25px}.page-header .page-header__dropdown .page-header__message--warning{background:url("../assets/images/icons/warning.svg") no-repeat;background-size:16px 16px;background-position:0 10px;padding-left:25px}.page-header .page-header__dropdown .page-header__message--success{background:url("../assets/images/icons/success.svg") no-repeat;background-size:16px 16px;background-position:0 10px;padding-left:25px}.page-header .page-header__dropdown .page-header__controls{padding:0;float:right}.search{position:relative}.search .search__input{font-size:16px;font-size:1rem;box-sizing:border-box;border-radius:4px;list-style:none;background:#fff;box-shadow:0 1px 1px rgba(0,0,0,0.1);width:100%;border:0;padding:15px;appearance:textfield}.search .search__input::placeholder{color:#888}.search .search__input::-ms-clear{display:none}.search .search__input::-webkit-search-decoration,.search .search__input::-webkit-search-cancel-button,.search .search__input::-webkit-search-results-button,.search .search__input::-webkit-search-results-decoration{display:none}.search .search__input:disabled,.search .search__input.search--disabled{background-color:#fff;opacity:.5;pointer-events:none}.search .search__input:disabled+.search__submit,.search .search__input.search--disabled+.search__submit{pointer-events:none;opacity:.5}.search .search__submit{position:absolute;top:15px;right:15px;background-color:transparent;background-image:url("../assets/images/icons/magnifying_glass.svg");background-position:center;background-repeat:no-repeat;background-size:20px;text-indent:-999em;display:block;width:20px;height:20px;overflow:hidden;outline:none;padding:0;border:0}.search .search__submit:hover{background-color:transparent;background-image:url("../assets/images/icons/magnifying_glass.svg")}.search .search__submit.search__submit--close{background-image:url("../assets/images/icons/remove.svg");background-size:16px}.u-animation--spin{animation:spin 1s infinite linear !important}.u-animation--pulse{animation:pulse 1s ease-out !important;animation-iteration-count:infinite !important;opacity:0}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}@keyframes pulse{0%{transform:scale(0.1, 0.1);opacity:0}50%{opacity:1}100%{transform:scale(1.2, 1.2);opacity:0}}.u-border{border:1px dotted #cdcdcd !important}.u-border--top{border-top:1px dotted #cdcdcd !important}.u-border--right{border-right:1px dotted #cdcdcd !important}.u-border--bottom{border-bottom:1px dotted #cdcdcd !important}.u-border--left{border-left:1px dotted #cdcdcd !important}.u-border--dotted{border-style:dotted !important}.u-border--solid{border-style:solid !important}.u-border--dashed{border-style:dashed !important}.u-border--none{border:0 !important}.u-align--right{text-align:right !important}.u-align--left{text-align:left !important}.u-align--center{text-align:center !important}.u-position--relative{position:relative !important}.u-position--fixed{position:fixed !important}.u-position--absolute{position:absolute !important}.u-float--right{float:right !important}.u-float--left{float:left !important}.u-float--none{float:none !important}.u-muted{opacity:.5 !important;filter:alpha(opacity=50) !important}.u-clear{clear:both !important}.u-display--block{display:block !important}.u-display--inline{display:inline !important}.u-display--inline-block{display:inline-block !important}.u-display--hidden{display:none !important}.u-width--full{width:100% !important}.u-width--half{width:50% !important}.u-width--third{width:calc(100%/3) !important}.u-width--quater{width:25% !important}.u-margin{margin:20px}.u-margin--none{margin:0 !important}.u-margin--tiny{margin:5px !important}.u-margin--small{margin:10px !important}.u-margin--medium{margin:30px !important}.u-margin--large{margin:40px !important}.u-margin--huge{margin:80px !important}.u-margin--top{margin-top:20px !important}.u-margin--top-none{margin-top:0 !important}.u-margin--top-tiny{margin-top:5px !important}.u-margin--top-small{margin-top:10px !important}.u-margin--top-medium{margin-top:30px !important}.u-margin--top-large{margin-top:40px !important}.u-margin--top-huge{margin-top:80px !important}.u-margin--right{margin-right:20px !important}.u-margin--right-none{margin-right:0 !important}.u-margin--right-tiny{margin-right:5px !important}.u-margin--right-small{margin-right:10px !important}.u-margin--right-medium{margin-right:30px !important}.u-margin--right-large{margin-right:40px !important}.u-margin--right-huge{margin-right:80px !important}.u-margin--bottom{margin-bottom:20px !important}.u-margin--bottom-none{margin-bottom:0 !important}.u-margin--bottom-tiny{margin-bottom:5px !important}.u-margin--bottom-small{margin-bottom:10px !important}.u-margin--bottom-medium{margin-bottom:30px !important}.u-margin--bottom-large{margin-bottom:40px !important}.u-margin--bottom-huge{margin-bottom:80px !important}.u-margin--left{margin-left:20px !important}.u-margin--left-none{margin-left:0 !important}.u-margin--left-tiny{margin-left:5px !important}.u-margin--left-small{margin-left:10px !important}.u-margin--left-medium{margin-left:30px !important}.u-margin--left-large{margin-left:40px !important}.u-margin--left-huge{margin-left:80px !important}.u-padding{padding:20px}.u-padding--none{padding:0 !important}.u-padding--tiny{padding:5px !important}.u-padding--small{padding:10px !important}.u-padding--medium{padding:30px !important}.u-padding--large{padding:40px !important}.u-padding--huge{padding:80px !important}.u-padding--top{padding-top:20px !important}.u-padding--top-none{padding-top:0 !important}.u-padding--top-tiny{padding-top:5px !important}.u-padding--top-small{padding-top:10px !important}.u-padding--top-medium{padding-top:30px !important}.u-padding--top-large{padding-top:40px !important}.u-padding--top-huge{padding-top:80px !important}.u-padding--right{padding-right:20px !important}.u-padding--right-none{padding-right:0 !important}.u-padding--right-tiny{padding-right:5px !important}.u-padding--right-small{padding-right:10px !important}.u-padding--right-medium{padding-right:30px !important}.u-padding--right-large{padding-right:40px !important}.u-padding--right-huge{padding-right:80px !important}.u-padding--bottom{padding-bottom:20px !important}.u-padding--bottom-none{padding-bottom:0 !important}.u-padding--bottom-tiny{padding-bottom:5px !important}.u-padding--bottom-small{padding-bottom:10px !important}.u-padding--bottom-medium{padding-bottom:30px !important}.u-padding--bottom-large{padding-bottom:40px !important}.u-padding--bottom-huge{padding-bottom:80px !important}.u-padding--left{padding-left:20px !important}.u-padding--left-none{padding-left:0 !important}.u-padding--left-tiny{padding-left:5px !important}.u-padding--left-small{padding-left:10px !important}.u-padding--left-medium{padding-left:30px !important}.u-padding--left-large{padding-left:40px !important}.u-padding--left-huge{padding-left:80px !important}.u-text--subtle{color:#888;font-size:.9375rem}.u-text--error{color:#df382c !important}.u-border--error{border-color:#df382c !important}.u-background--error{background-color:#df382c !important}.has-error{border:1px solid #df382c !important}.has-error:focus{border:1px solid #df382c !important}.u-text--off{color:#d2d2d2 !important}.u-border--off{border-color:#d2d2d2 !important}.u-background--off{background-color:#d2d2d2 !important}.has-off{border:1px solid #d2d2d2 !important}.has-off:focus{border:1px solid #d2d2d2 !important}.u-text--warning{color:#eca918 !important}.u-border--warning{border-color:#eca918 !important}.u-background--warning{background-color:#eca918 !important}.has-warning{border:1px solid #eca918 !important}.has-warning:focus{border:1px solid #eca918 !important}.u-text--success{color:#38b44a !important}.u-border--success{border-color:#38b44a !important}.u-background--success{background-color:#38b44a !important}.has-success{border:1px solid #38b44a !important}.has-success:focus{border:1px solid #38b44a !important}.u-text--on{color:#38b44a !important}.u-border--on{border-color:#38b44a !important}.u-background--on{background-color:#38b44a !important}.has-on{border:1px solid #38b44a !important}.has-on:focus{border:1px solid #38b44a !important}.u-text--information{color:#19b6ee !important}.u-border--information{border-color:#19b6ee !important}.u-background--information{background-color:#19b6ee !important}.has-information{border:1px solid #19b6ee !important}.has-information:focus{border:1px solid #19b6ee !important}.u-text--loading{color:#2ab7ec !important}.u-border--loading{border-color:#2ab7ec !important}.u-background--loading{background-color:#2ab7ec !important}.has-loading{border:1px solid #2ab7ec !important}.has-loading:focus{border:1px solid #2ab7ec !important}.u-vertical-align{position:relative;top:50%;transform:translateY(-50%)}.u-text--truncate{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.hidden{display:none}.small-icon{width:12px}.images-info{text-align:center;padding:10px}.images-warning{box-sizing:border-box;border-radius:2px;list-style:none;padding:15px 20px 15px 45px;background-repeat:no-repeat;box-shadow:0 1px 1px rgba(0,0,0,0.1);background:#fff url("../assets/images/icons/error.svg") no-repeat;background-size:16px 16px;background-position:15px center;margin-bottom:20px}#loader{width:10px;margin:16px auto 0 auto}#importing{box-sizing:border-box;border-radius:2px;list-style:none;padding:15px;font-size:16px;margin:0 0 20px;background:#fff;background-position:top 50% left 15px;background-repeat:no-repeat;box-shadow:0 1px 1px rgba(0,0,0,0.1)}#importing .spinner{margin-top:-3px}.spinner{width:16px;height:16px;padding:0;border-bottom:0 !important;display:inline-block;vertical-align:middle;text-indent:999em;background:url("../assets/images/icons/loading.png") no-repeat;background-size:100% 100%}.spin{animation:spin 1s infinite linear !important}.importing-dot{opacity:0;-webkit-animation:dot 1.3s infinite;animation:dot 1.3s infinite}.accounts .logout .divide{padding:0 20px 0 30px;display:inline-block}.accounts .api li{position:relative}.accounts .api li input[type='text']{line-height:30px;padding-right:30px;width:100%}.accounts .api li input[type='text']::-webkit-input-placeholder{color:#333}.accounts .api li input[type='text']:-moz-placeholder{color:#333}.accounts .api li input[type='text']::-moz-placeholder{color:#333}.accounts .api li input[type='text']:-ms-input-placeholder{color:#333}.accounts .api li .delete-link{position:absolute;top:13px;right:15px}.script-content{width:100%;overflow:hidden}.script-content .content{margin:20px 0 0} |
1564 | |
1565 | === renamed file 'src/maasserver/static/css/build.css' => 'src/maasserver/static/css/build.css.moved' |
1566 | === modified file 'src/maasserver/static/js/angular/controllers/dashboard.js' |
1567 | === modified file 'src/maasserver/static/js/angular/controllers/node_details.js' |
1568 | === modified file 'src/maasserver/static/js/angular/controllers/tests/test_dashboard.js' |
1569 | === modified file 'src/maasserver/static/js/angular/controllers/tests/test_node_details.js' |
1570 | --- src/maasserver/static/js/angular/controllers/tests/test_node_details.js 2017-04-20 08:58:42 +0000 |
1571 | +++ src/maasserver/static/js/angular/controllers/tests/test_node_details.js 2017-04-25 09:34:40 +0000 |
1572 | @@ -1039,46 +1039,89 @@ |
1573 | }); |
1574 | }); |
1575 | |
1576 | - it("calls performAction with hwe kernel", function() { |
1577 | - var controller = makeController(); |
1578 | - spyOn(MachinesManager, "performAction").and.returnValue( |
1579 | - $q.defer().promise); |
1580 | - $scope.node = node; |
1581 | - $scope.action.option = { |
1582 | - name: "deploy" |
1583 | - }; |
1584 | - $scope.osSelection.osystem = "ubuntu"; |
1585 | - $scope.osSelection.release = "ubuntu/xenial"; |
1586 | - $scope.osSelection.hwe_kernel = "hwe-16.04-edge"; |
1587 | - $scope.actionGo(); |
1588 | - expect(MachinesManager.performAction).toHaveBeenCalledWith( |
1589 | - node, "deploy", { |
1590 | - osystem: "ubuntu", |
1591 | - distro_series: "xenial", |
1592 | - hwe_kernel: "hwe-16.04-edge" |
1593 | - }); |
1594 | - }); |
1595 | - |
1596 | - it("calls performAction with ga kernel", function() { |
1597 | - var controller = makeController(); |
1598 | - spyOn(MachinesManager, "performAction").and.returnValue( |
1599 | - $q.defer().promise); |
1600 | - $scope.node = node; |
1601 | - $scope.action.option = { |
1602 | - name: "deploy" |
1603 | - }; |
1604 | - $scope.osSelection.osystem = "ubuntu"; |
1605 | - $scope.osSelection.release = "ubuntu/xenial"; |
1606 | - $scope.osSelection.hwe_kernel = "ga-16.04"; |
1607 | - $scope.actionGo(); |
1608 | - expect(MachinesManager.performAction).toHaveBeenCalledWith( |
1609 | - node, "deploy", { |
1610 | - osystem: "ubuntu", |
1611 | - distro_series: "xenial", |
1612 | - hwe_kernel: "ga-16.04" |
1613 | - }); |
1614 | - }); |
1615 | - |
1616 | +<<<<<<< TREE |
1617 | + it("calls performAction with hwe kernel", function() { |
1618 | + var controller = makeController(); |
1619 | + spyOn(MachinesManager, "performAction").and.returnValue( |
1620 | + $q.defer().promise); |
1621 | + $scope.node = node; |
1622 | + $scope.action.option = { |
1623 | + name: "deploy" |
1624 | + }; |
1625 | + $scope.osSelection.osystem = "ubuntu"; |
1626 | + $scope.osSelection.release = "ubuntu/xenial"; |
1627 | + $scope.osSelection.hwe_kernel = "hwe-16.04-edge"; |
1628 | + $scope.actionGo(); |
1629 | + expect(MachinesManager.performAction).toHaveBeenCalledWith( |
1630 | + node, "deploy", { |
1631 | + osystem: "ubuntu", |
1632 | + distro_series: "xenial", |
1633 | + hwe_kernel: "hwe-16.04-edge" |
1634 | + }); |
1635 | + }); |
1636 | + |
1637 | + it("calls performAction with ga kernel", function() { |
1638 | + var controller = makeController(); |
1639 | + spyOn(MachinesManager, "performAction").and.returnValue( |
1640 | + $q.defer().promise); |
1641 | + $scope.node = node; |
1642 | + $scope.action.option = { |
1643 | + name: "deploy" |
1644 | + }; |
1645 | + $scope.osSelection.osystem = "ubuntu"; |
1646 | + $scope.osSelection.release = "ubuntu/xenial"; |
1647 | + $scope.osSelection.hwe_kernel = "ga-16.04"; |
1648 | + $scope.actionGo(); |
1649 | + expect(MachinesManager.performAction).toHaveBeenCalledWith( |
1650 | + node, "deploy", { |
1651 | + osystem: "ubuntu", |
1652 | + distro_series: "xenial", |
1653 | + hwe_kernel: "ga-16.04" |
1654 | + }); |
1655 | + }); |
1656 | + |
1657 | +======= |
1658 | + it("calls performAction with hwe kernel", function() { |
1659 | + var controller = makeController(); |
1660 | + spyOn(MachinesManager, "performAction").and.returnValue( |
1661 | + $q.defer().promise); |
1662 | + $scope.node = node; |
1663 | + $scope.actionOption = { |
1664 | + name: "deploy" |
1665 | + }; |
1666 | + $scope.osSelection.osystem = "ubuntu"; |
1667 | + $scope.osSelection.release = "ubuntu/xenial"; |
1668 | + $scope.osSelection.hwe_kernel = "hwe-16.04-edge"; |
1669 | + $scope.actionGo(); |
1670 | + expect(MachinesManager.performAction).toHaveBeenCalledWith( |
1671 | + node, "deploy", { |
1672 | + osystem: "ubuntu", |
1673 | + distro_series: "xenial", |
1674 | + hwe_kernel: "hwe-16.04-edge" |
1675 | + }); |
1676 | + }); |
1677 | + |
1678 | + it("calls performAction with ga kernel", function() { |
1679 | + var controller = makeController(); |
1680 | + spyOn(MachinesManager, "performAction").and.returnValue( |
1681 | + $q.defer().promise); |
1682 | + $scope.node = node; |
1683 | + $scope.actionOption = { |
1684 | + name: "deploy" |
1685 | + }; |
1686 | + $scope.osSelection.osystem = "ubuntu"; |
1687 | + $scope.osSelection.release = "ubuntu/xenial"; |
1688 | + $scope.osSelection.hwe_kernel = "ga-16.04"; |
1689 | + $scope.actionGo(); |
1690 | + expect(MachinesManager.performAction).toHaveBeenCalledWith( |
1691 | + node, "deploy", { |
1692 | + osystem: "ubuntu", |
1693 | + distro_series: "xenial", |
1694 | + hwe_kernel: "ga-16.04" |
1695 | + }); |
1696 | + }); |
1697 | + |
1698 | +>>>>>>> MERGE-SOURCE |
1699 | it("calls performAction with commissionOptions", function() { |
1700 | var controller = makeController(); |
1701 | spyOn(MachinesManager, "performAction").and.returnValue( |
1702 | |
1703 | === modified file 'src/maasserver/static/js/angular/directives/boot_images.js' |
1704 | === modified file 'src/maasserver/static/js/angular/directives/error_overlay.js' |
1705 | === modified file 'src/maasserver/static/js/angular/directives/maas_obj_form.js' |
1706 | === modified file 'src/maasserver/static/js/angular/directives/tests/test_boot_images.js' |
1707 | === modified file 'src/maasserver/static/js/angular/directives/tests/test_maas_obj_form.js' |
1708 | === modified file 'src/maasserver/static/js/angular/maas.js' |
1709 | --- src/maasserver/static/js/angular/maas.js 2017-03-10 18:38:46 +0000 |
1710 | +++ src/maasserver/static/js/angular/maas.js 2017-04-25 09:34:40 +0000 |
1711 | @@ -8,8 +8,13 @@ |
1712 | * conflicts with Django templates. |
1713 | */ |
1714 | |
1715 | +<<<<<<< TREE |
1716 | angular.module('MAAS', |
1717 | ['ngRoute', 'ngCookies', 'ngSanitize', 'ngTagsInput', 'sticky']).config( |
1718 | +======= |
1719 | +angular.module('MAAS', |
1720 | + ['ngRoute', 'ngCookies', 'ngTagsInput', 'sticky']).config( |
1721 | +>>>>>>> MERGE-SOURCE |
1722 | function($interpolateProvider, $routeProvider, $httpProvider) { |
1723 | $interpolateProvider.startSymbol('{$'); |
1724 | $interpolateProvider.endSymbol('$}'); |
1725 | |
1726 | === modified file 'src/maasserver/static/partials/boot-images.html' |
1727 | === modified file 'src/maasserver/static/partials/dashboard.html' |
1728 | --- src/maasserver/static/partials/dashboard.html 2017-04-18 10:57:48 +0000 |
1729 | +++ src/maasserver/static/partials/dashboard.html 2017-04-25 09:34:40 +0000 |
1730 | @@ -1,3 +1,4 @@ |
1731 | +<<<<<<< TREE |
1732 | <header class="page-header" sticky media-query="min-width: 769px" window-width> |
1733 | <div class="wrapper--inner"> |
1734 | <h1 class="page-header__title">Device discovery</h1> |
1735 | @@ -117,8 +118,156 @@ |
1736 | <dt class="two-col">Subnet</dt> |
1737 | <dd class="four-col last-col">{$ getSubnetName(discovery.subnet) $}</dd> |
1738 | </dl> |
1739 | +======= |
1740 | +<div data-ng-hide="loaded"> |
1741 | + <header class="page-header" sticky> |
1742 | + <div class="wrapper--inner"> |
1743 | + <h1 class="page-header__title">Device discovery</h1> |
1744 | + <p class="page-header__status"> |
1745 | + <span class="u-text--loading"><i class="icon u-margin--right-tiny icon--loading u-animation--spin"></i>Searching network for devices…</span> |
1746 | + </p> |
1747 | + </div> |
1748 | + </header> |
1749 | + <section class="row"> |
1750 | + <div class="wrapper--inner"> |
1751 | + <div class="twelve-col"> |
1752 | + <table> |
1753 | + <thead> |
1754 | + <tr> |
1755 | + <th class="table-col--37">Name</th> |
1756 | + <th class="table-col--15">Mac address</th> |
1757 | + <th class="table-col--13">IP</th> |
1758 | + <th class="table-col--15">Rack</th> |
1759 | + <th class="table-col--20">Last seen</th> |
1760 | + </tr> |
1761 | + </thead> |
1762 | + <tbody> |
1763 | + <tr> |
1764 | + <td colspan="5"> |
1765 | + No new discoveries |
1766 | + </td> |
1767 | + </tr> |
1768 | + </tbody> |
1769 | + </table> |
1770 | + </div> |
1771 | + </div> |
1772 | + </section> |
1773 | +</div> |
1774 | +<div class="ng-hide" data-ng-show="loaded"> |
1775 | + <header class="page-header" sticky> |
1776 | + <div class="wrapper--inner"> |
1777 | + <h1 class="page-header__title">Device discovery</h1> |
1778 | + <p class="page-header__status" >{$ discoveredDevices.length $} items discovered</p> |
1779 | + <div class="page-header__controls" data-ng-if="networkDiscovery"> |
1780 | + <maas-obj-form obj="networkDiscovery" manager="configManager" inline="true"> |
1781 | + <maas-obj-field type="onoffswitch" key="value" label="Discovery enabled" |
1782 | + on-value="enabled" off-value="disabled" subtle="true" label-left="true" |
1783 | + label-info="When enabled, MAAS will use passive techniques, such as listening to
 ARP requests and DNS advertisements, to observe networks attached
 to rack controllers. Active subnet mapping can also be enabled in the
 Device Discovery section of the Settings page."></maas-obj-field> |
1784 | + </maas-obj-form> |
1785 | + </div> |
1786 | + </div> |
1787 | + </header> |
1788 | + <section class="row"> |
1789 | + <div class="wrapper--inner"> |
1790 | + <ul class="flash-messages u-padding--bottom" data-ng-if="networkDiscovery.value === 'disabled'"> |
1791 | + <li class="flash-messages__item flash-messages__item--warning">List of devices will not update as discovery is turned off</li> |
1792 | + </ul> |
1793 | + <div class="twelve-col"> |
1794 | + <div class="table" > |
1795 | + <header class="table__head" sticky sticky-class="table__head--sticky" offset="116"> |
1796 | + <div class="table__row"> |
1797 | + <div class="table__header table-col--37">Name</div> |
1798 | + <div class="table__header table-col--15">Mac address</div> |
1799 | + <div class="table__header table-col--13">IP</div> |
1800 | + <div class="table__header table-col--15">Rack</div> |
1801 | + <div class="table__header table-col--20">Last seen</div> |
1802 | + </div> |
1803 | + </header> |
1804 | + <div class="table__body"> |
1805 | + <div class="table__row table--success" data-ng-if="convertTo.saved"> |
1806 | + <div class="table__data table-col--97"> |
1807 | + <i class="icon icon--success"></i> {$ convertTo.hostname $} has been add to {$ site $}. |
1808 | + <a href="#/node/{$ convertTo.parent $}" data-ng-if="convertTo.parent">Go to the machine devices page.</a> |
1809 | + <a href="#/nodes/?tab=devices" data-ng-if="!convertTo.parent">Go to the device listing.</a> |
1810 | + </div> |
1811 | + <div class="table__data table-col--3"> |
1812 | + <i class="icon icon--cross tooltip" aria-label="Clear" |
1813 | + data-ng-click="convertTo.saved = false">Clear</i> |
1814 | + </div> |
1815 | + </div> |
1816 | + <div class="table__row" data-ng-if="!discoveredDevices.length"> |
1817 | + <div class="table__data table-col--100"> |
1818 | + No new discoveries |
1819 | + </div> |
1820 | + </div> |
1821 | + <div class="table__row" |
1822 | + data-ng-repeat="discovery in discoveredDevices | orderBy:'-last_seen' track by discovery.first_seen" |
1823 | + data-ng-class="{'is-active' : discovery.first_seen === selectedDevice}"> |
1824 | + <div data-ng-if="discovery.first_seen !== selectedDevice" |
1825 | + data-ng-dblclick="toggleSelected(discovery.first_seen)"> |
1826 | + <div class="table__data table-col--37"> |
1827 | + {$ getDiscoveryName(discovery) $} |
1828 | + <i data-ng-show="discovery.is_external_dhcp === true" class="icon icon--info tooltip u-margin--left-tiny ng-hide" aria-label="This device is providing DHCP."></i> |
1829 | + </div> |
1830 | + <div class="table__data table-col--15"> |
1831 | + {$ discovery.mac_address $}<br/> |
1832 | + <small class="u-text--subtle">{$ discovery.mac_organization || 'Unknown' $}</small> |
1833 | + </div> |
1834 | + <div class="table__data table-col--13 u-text--truncate"> |
1835 | + {$ discovery.ip $} |
1836 | + </div> |
1837 | + <div class="table__data table-col--15"> |
1838 | + {$ discovery.observer_hostname $} |
1839 | + </div> |
1840 | + <div class="table__data table-col--17"> |
1841 | + <time>{$ discovery.last_seen $}</time> |
1842 | + </div> |
1843 | + <div class="table__data table-col--3"> |
1844 | + <i class="icon icon--open tooltip" aria-label="Open" |
1845 | + data-ng-click="toggleSelected(discovery.first_seen)">Open</i> |
1846 | + </div> |
1847 | + </div> |
1848 | + <maas-obj-form data-ng-if="discovery.first_seen === selectedDevice" |
1849 | + obj="convertTo" manager="proxyManager" pre-process="preProcess" |
1850 | + after-save="afterSave" table-form="true" save-on-blur="false"> |
1851 | + <div class="table__data table-col--20"> |
1852 | + <maas-obj-field class="u-margin--bottom-none" type="text" key="hostname" |
1853 | + disable-label="true" placeholder="Hostname (optional)"></maas-obj-field> |
1854 | + </div> |
1855 | + <div class="table__data table-col--77"></div> |
1856 | + <div class="table__data table-col--3"> |
1857 | + <i class="icon icon--close tooltip" aria-label="Close" |
1858 | + data-ng-click="toggleSelected(discovery.first_seen)">Close</i> |
1859 | + </div> |
1860 | + <div class="table__dropdown"> |
1861 | + <div class="table__row is-active"> |
1862 | + <div class="table__data table-col--100"> |
1863 | + <div class="six-col"> |
1864 | + <dl> |
1865 | + <dt class="two-col">Mac</dt> |
1866 | + <dd class="four-col last-col">{$ discovery.mac_address $}</dd> |
1867 | + <dt class="two-col">IP</dt> |
1868 | + <dd class="four-col last-col">{$ discovery.ip $}</dd> |
1869 | + <dt class="two-col">Rack</dt> |
1870 | + <dd class="four-col last-col">{$ discovery.observer_hostname $}</dd> |
1871 | + <dt class="two-col">Last seen</dt> |
1872 | + <dd class="four-col last-col"><time>{$ discovery.last_seen $}</time></dd> |
1873 | + </dl> |
1874 | + </div> |
1875 | + <div class="six-col last-col"> |
1876 | + <dl> |
1877 | + <dt class="two-col">Fabric</dt> |
1878 | + <dd class="four-col last-col">{$ discovery.fabric_name $}</dd> |
1879 | + <dt class="two-col">VLAN</dt> |
1880 | + <dd class="four-col last-col">{$ getVLANName(discovery.vlan) $}</dd> |
1881 | + <dt class="two-col">Subnet</dt> |
1882 | + <dd class="four-col last-col">{$ getSubnetName(discovery.subnet) $}</dd> |
1883 | + </dl> |
1884 | + </div> |
1885 | +>>>>>>> MERGE-SOURCE |
1886 | </div> |
1887 | </div> |
1888 | +<<<<<<< TREE |
1889 | </div> |
1890 | <div class="table__row is-active u-padding--top-small"> |
1891 | <div class="table__data table-col--100"> |
1892 | @@ -138,7 +287,22 @@ |
1893 | <option value="device">Device</option> |
1894 | <option value="interface">Interface</option> |
1895 | </select> |
1896 | +======= |
1897 | + <div class="table__row is-active u-padding--top-small"> |
1898 | + <div class="table__data table-col--100"> |
1899 | + <fieldset class="form__fieldset six-col"> |
1900 | + <div class="form__group"> |
1901 | + <label class="form__group-label two-col u-margin--bottom-small">Type</label> |
1902 | + <div class="form__group-input three-col"> |
1903 | + <select name="type" ng-model="convertTo.type"> |
1904 | + <option value="" disabled>Choose type</option> |
1905 | + <option value="device">Device</option> |
1906 | + <option value="interface">Interface</option> |
1907 | + </select> |
1908 | + </div> |
1909 | +>>>>>>> MERGE-SOURCE |
1910 | </div> |
1911 | +<<<<<<< TREE |
1912 | </div> |
1913 | <maas-obj-field type="options" key="domain" label="Domain" placeholder="Choose domain" |
1914 | label-width="two" input-width="three" subtle="false" |
1915 | @@ -178,9 +342,55 @@ |
1916 | </div> |
1917 | </div> |
1918 | </maas-obj-form> |
1919 | +======= |
1920 | + <maas-obj-field type="options" key="domain" label="Domain" placeholder="Choose domain" |
1921 | + label-width="two" input-width="three" subtle="false" |
1922 | + options="domain as domain.name for domain in domains" |
1923 | + data-ng-if="convertTo.type === 'device'"></maas-obj-field> |
1924 | + <maas-obj-field type="options" subtle="false" key="system_id" label="Device name" placeholder="Select device name" |
1925 | + options="device.system_id as device.fqdn for device in devices | orderBy:'fqdn'" |
1926 | + label-width="two" label-info="Create as an interface on the selected device." input-width="three" |
1927 | + data-ng-if="convertTo.type === 'interface'"></maas-obj-field> |
1928 | + </fieldset> |
1929 | + <fieldset class="form__fieldset six-col last-col"> |
1930 | + <maas-obj-field type="options" subtle="false" key="parent" label="Parent" placeholder="Select parent (optional)" placeholder-enabled="true" |
1931 | + options="machine.system_id as machine.fqdn for machine in machines | filter:{status_code: 6} | orderBy:'fqdn'" |
1932 | + label-width="two" label-info="Assign this device as a child of the parent machine." input-width="three" |
1933 | + data-ng-if="convertTo.type === 'device'"></maas-obj-field> |
1934 | + <maas-obj-field type="options" subtle="false" key="ip_assignment" label="IP assignment" placeholder="Select IP assignment" |
1935 | + options="option[0] as option[1] for option in convertTo.deviceIPOptions" label-width="two" input-width="three"></maas-obj-field> |
1936 | + </fieldset> |
1937 | + </div> |
1938 | + </div> |
1939 | + <div class="table__row is-active"> |
1940 | + <div class="table__data u-float--left"> |
1941 | + <maas-obj-errors></maas-obj-errors> |
1942 | + </div> |
1943 | + <div class="table__data u-float--right"> |
1944 | + <a class="button--base button--inline" data-ng-click="toggleSelected(selectedDevice)">Cancel</a> |
1945 | + <button class="button--secondary button--inline" |
1946 | + data-ng-click="convertTo.goTo = true" |
1947 | + data-ng-if="!convertTo.$maasForm.getValue('parent')" |
1948 | + maas-obj-save>Save and go to device listing</button> |
1949 | + <button class="button--secondary button--inline" |
1950 | + data-ng-click="convertTo.goTo = true" |
1951 | + data-ng-if="convertTo.$maasForm.getValue('parent')" |
1952 | + maas-obj-save>Save and go to machine details</button> |
1953 | + <button class="button--primary button--inline" maas-obj-save>Save</button> |
1954 | + </div> |
1955 | + </div> |
1956 | + </div> |
1957 | + </maas-obj-form> |
1958 | + </div> |
1959 | +>>>>>>> MERGE-SOURCE |
1960 | </div> |
1961 | </div> |
1962 | </div> |
1963 | </div> |
1964 | +<<<<<<< TREE |
1965 | </div> |
1966 | </div> |
1967 | +======= |
1968 | + </section> |
1969 | +</div> |
1970 | +>>>>>>> MERGE-SOURCE |
1971 | |
1972 | === modified file 'src/maasserver/static/partials/domain-details.html' |
1973 | --- src/maasserver/static/partials/domain-details.html 2017-03-27 13:09:56 +0000 |
1974 | +++ src/maasserver/static/partials/domain-details.html 2017-04-25 09:34:40 +0000 |
1975 | @@ -1,4 +1,8 @@ |
1976 | +<<<<<<< TREE |
1977 | <header class="page-header" sticky media-query="min-width: 769px"> |
1978 | +======= |
1979 | +<header class="page-header" sticky> |
1980 | +>>>>>>> MERGE-SOURCE |
1981 | <div class="wrapper--inner"> |
1982 | <h1 class="page-header__title"> |
1983 | {$ domain.displayname $}: |
1984 | |
1985 | === modified file 'src/maasserver/static/partials/domains-list.html' |
1986 | --- src/maasserver/static/partials/domains-list.html 2017-04-04 13:24:28 +0000 |
1987 | +++ src/maasserver/static/partials/domains-list.html 2017-04-25 09:34:40 +0000 |
1988 | @@ -1,4 +1,8 @@ |
1989 | +<<<<<<< TREE |
1990 | <header class="page-header" sticky media-query="min-width: 769px"> |
1991 | +======= |
1992 | +<header class="page-header" sticky> |
1993 | +>>>>>>> MERGE-SOURCE |
1994 | <div class="wrapper--inner"> |
1995 | <h1 class="page-header__title">DNS</h1> |
1996 | <p class="page-header__status" data-ng-show="loading"><span class="u-text--loading"><i class="icon icon--loading u-animation--spin"></i> Loading...</span></p> |
1997 | |
1998 | === modified file 'src/maasserver/static/partials/error.html' |
1999 | --- src/maasserver/static/partials/error.html 2017-01-28 00:51:47 +0000 |
2000 | +++ src/maasserver/static/partials/error.html 2017-04-25 09:34:40 +0000 |
2001 | @@ -1,4 +1,8 @@ |
2002 | +<<<<<<< TREE |
2003 | <header class="page-header" sticky media-query="min-width: 769px"> |
2004 | +======= |
2005 | +<header class="page-header" sticky> |
2006 | +>>>>>>> MERGE-SOURCE |
2007 | <div class="wrapper--inner"> |
2008 | <h1 class="page-header__title">Error</h1> |
2009 | <div class="page-header__controls"> |
2010 | |
2011 | === modified file 'src/maasserver/static/partials/fabric-details.html' |
2012 | --- src/maasserver/static/partials/fabric-details.html 2017-03-27 13:09:56 +0000 |
2013 | +++ src/maasserver/static/partials/fabric-details.html 2017-04-25 09:34:40 +0000 |
2014 | @@ -1,12 +1,20 @@ |
2015 | <div data-ng-hide="loaded"> |
2016 | +<<<<<<< TREE |
2017 | <header class="page-header" sticky media-query="min-width: 769px"> |
2018 | +======= |
2019 | + <header class="page-header" sticky> |
2020 | +>>>>>>> MERGE-SOURCE |
2021 | <div class="wrapper--inner"> |
2022 | <h1 class="page-header__title">Loading...</h1> |
2023 | </div> |
2024 | </header> |
2025 | </div> |
2026 | <div class="ng-hide" data-ng-show="loaded"> |
2027 | +<<<<<<< TREE |
2028 | <header class="page-header" sticky media-query="min-width: 769px"> |
2029 | +======= |
2030 | + <header class="page-header" sticky> |
2031 | +>>>>>>> MERGE-SOURCE |
2032 | <div class="wrapper--inner"> |
2033 | <h1 class="page-header__title">{$ fabric.name $}</h1> |
2034 | <div class="page-header__controls ng-hide" data-ng-show="isSuperUser() && !isDefaultFabric() && !loading"> |
2035 | |
2036 | === modified file 'src/maasserver/static/partials/images.html' |
2037 | === modified file 'src/maasserver/static/partials/intro-user.html' |
2038 | --- src/maasserver/static/partials/intro-user.html 2017-02-17 14:23:04 +0000 |
2039 | +++ src/maasserver/static/partials/intro-user.html 2017-04-25 09:34:40 +0000 |
2040 | @@ -1,4 +1,5 @@ |
2041 | <div class="row" data-ng-if="!loading"> |
2042 | +<<<<<<< TREE |
2043 | <div class="wrapper--inner"> |
2044 | <div class="twelve-col"> |
2045 | <div class="action-card"> |
2046 | @@ -29,5 +30,37 @@ |
2047 | data-ng-disabled="!canContinue()" |
2048 | data-ng-click="clickContinue()">Go to dashboard</button> |
2049 | </div> |
2050 | +======= |
2051 | + <div class="wrapper--inner"> |
2052 | + <div class="twelve-col"> |
2053 | + <div class="action-card"> |
2054 | + <h2 class="action-card__title"> |
2055 | + <i class="icon icon--large u-margin--right-tiny" |
2056 | + data-ng-class="{'icon--success': canContinue(), 'icon--success-grey': !canContinue()}"></i> |
2057 | + SSH keys for {$ user.username $} |
2058 | + </h2> |
2059 | + <div class="action-card__controls"> |
2060 | + <p class="u-margin--top">Add multiple keys from Launchpad and Github or enter them manually.</p> |
2061 | + <h3>Keys</h3> |
2062 | + <maas-ssh-keys></maas-ssh-keys> |
2063 | + </div> |
2064 | + </div> |
2065 | + <div class="action-card" |
2066 | + data-ng-if="isSuperUser()" |
2067 | + data-ng-class="{'u-muted': !canContinue()}"> |
2068 | + <h2 class="action-card__title"> |
2069 | + MAAS has been successfully set up |
2070 | + </h2> |
2071 | + <div class="action-card__controls"> |
2072 | + <p class="u-margin--top"><i class="icon icon--success u-margin--right-small"></i>Once DHCP is enabled, set your machines to PXE boot and they will be automatically enlisted in the Nodes tab.</p> |
2073 | + <p class="u-margin--top"><i class="icon icon--success u-margin--right-small"></i>Discovered MAC/IP pairs in your network will be listed on your dashboard and can be added to MAAS.</p> |
2074 | + <p class="u-margin--top u-margin--bottom"><i class="icon icon--success u-margin--right-small"></i>The fabrics, VLANs and subnets in your network will be automatically added to MAAS in Networks.</p> |
2075 | + </div> |
2076 | + </div> |
2077 | + <button class="button button--primary button--large" |
2078 | + data-ng-disabled="!canContinue()" |
2079 | + data-ng-click="clickContinue()">Go to dashboard</button> |
2080 | + </div> |
2081 | +>>>>>>> MERGE-SOURCE |
2082 | </div> |
2083 | </div> |
2084 | |
2085 | === modified file 'src/maasserver/static/partials/intro.html' |
2086 | --- src/maasserver/static/partials/intro.html 2017-02-17 14:23:04 +0000 |
2087 | +++ src/maasserver/static/partials/intro.html 2017-04-25 09:34:40 +0000 |
2088 | @@ -1,4 +1,5 @@ |
2089 | <div class="row" data-ng-if="!loading"> |
2090 | +<<<<<<< TREE |
2091 | <div class="wrapper--inner"> |
2092 | <div class="twelve-col-col"> |
2093 | <div class="action-card"> |
2094 | @@ -67,5 +68,75 @@ |
2095 | data-ng-disabled="!canContinue()" |
2096 | data-ng-click="clickContinue()">Continue</button> |
2097 | </div> |
2098 | +======= |
2099 | + <div class="wrapper--inner"> |
2100 | + <div class="twelve-col-col"> |
2101 | + <div class="action-card"> |
2102 | + <h2 class="action-card__title"> |
2103 | + <i class="icon icon--large u-margin--right-tiny" |
2104 | + data-ng-class="{ 'icon--success': !welcomeInError(), 'icon--error': welcomeInError() }"></i> |
2105 | + Welcome to MAAS |
2106 | + </h2> |
2107 | + <div class="action-card__controls"> |
2108 | + <div class="u-margin--top"> |
2109 | + <maas-obj-form obj="maasName" manager="configManager"> |
2110 | + <div class="five-col"> |
2111 | + <maas-obj-field type="text" key="value" label="Region name" placeholder="e.g. us-west" subtle="false" blur-on-enter="true"></maas-obj-field> |
2112 | + </div> |
2113 | + </maas-obj-form> |
2114 | + </div> |
2115 | + </div> |
2116 | + </div> |
2117 | + <div class="action-card"> |
2118 | + <h2 class="action-card__title"> |
2119 | + <i class="icon icon--large u-margin--right-tiny" |
2120 | + data-ng-class="{ 'icon--success': !networkInError(), 'icon--error': networkInError() }"></i> |
2121 | + Connectivity |
2122 | + </h2> |
2123 | + <div class="action-card__controls"> |
2124 | + <div class="row u-border--none u-padding--none u-margin--top"> |
2125 | + <maas-obj-form obj="upstreamDNS" manager="configManager"> |
2126 | + <div class="five-col"> |
2127 | + <maas-obj-field type="text" key="value" label="DNS forwarder" placeholder="e.g. 8.8.8.8" subtle="false" blur-on-enter="true"></maas-obj-field> |
2128 | + </div> |
2129 | + <div class="five-col u-padding--top-tiny"></div> |
2130 | + <div class="seven-col last-col u-text--subtle">The address used to resolve domains not managed by MAAS. The value is used as the value of 'forwarders' in the DNS server configuration.</div> |
2131 | + </maas-obj-form> |
2132 | + </div> |
2133 | + <div class="row u-border--none u-padding--none"> |
2134 | + <maas-obj-form obj="mainArchive" manager="repoManager"> |
2135 | + <div class="five-col"> |
2136 | + <maas-obj-field type="text" key="url" label="Ubuntu archive" subtle="false" blur-on-enter="true"></maas-obj-field> |
2137 | + </div> |
2138 | + <div class="five-col u-padding--top-tiny"></div> |
2139 | + <div class="seven-col last-col u-text--subtle">The server where machines retrieve packages for Intel architectures.</div> |
2140 | + </maas-obj-form> |
2141 | + </div> |
2142 | + <div class="row u-border--none u-padding--none"> |
2143 | + <maas-obj-form obj="portsArchive" manager="repoManager"> |
2144 | + <div class="five-col"> |
2145 | + <maas-obj-field type="text" key="url" label="Ubuntu extra architectures" subtle="false" blur-on-enter="true"></maas-obj-field> |
2146 | + </div> |
2147 | + <div class="five-col u-padding--top-tiny"></div> |
2148 | + <div class="seven-col last-col u-text--subtle">Archive used by machines to retrieve packages for non-Intel architectures.</div> |
2149 | + </maas-obj-form> |
2150 | + </div> |
2151 | + <div class="row u-border--none u-padding--none"> |
2152 | + <maas-obj-form obj="httpProxy" manager="configManager"> |
2153 | + <div class="five-col"> |
2154 | + <maas-obj-field type="text" key="value" label="APT & HTTP/HTTPS proxy server" subtle="false" blur-on-enter="true"></maas-obj-field> |
2155 | + </div> |
2156 | + <div class="five-col u-padding--top-tiny"></div> |
2157 | + <div class="seven-col last-col u-text--subtle">This will be passed onto deployed machines to use as a proxy for APT traffic. MAAS also uses the proxy for downloading boot images. In no URL is provided, the build-in MAAS proxy will be used.</div> |
2158 | + </maas-obj-form> |
2159 | + </div> |
2160 | + </div> |
2161 | + </div> |
2162 | + <maas-boot-images design="'action-card'"></maas-boot-images> |
2163 | + <button class="button button--primary button--large" |
2164 | + data-ng-disabled="!canContinue()" |
2165 | + data-ng-click="clickContinue()">Continue</button> |
2166 | + </div> |
2167 | +>>>>>>> MERGE-SOURCE |
2168 | </div> |
2169 | </div> |
2170 | |
2171 | === modified file 'src/maasserver/static/partials/networks-list.html' |
2172 | --- src/maasserver/static/partials/networks-list.html 2017-04-10 15:35:18 +0000 |
2173 | +++ src/maasserver/static/partials/networks-list.html 2017-04-25 09:34:40 +0000 |
2174 | @@ -1,4 +1,8 @@ |
2175 | +<<<<<<< TREE |
2176 | <header class="page-header" sticky media-query="min-width: 769px"> |
2177 | +======= |
2178 | +<header class="page-header" sticky> |
2179 | +>>>>>>> MERGE-SOURCE |
2180 | <div class="wrapper--inner"> |
2181 | <h1 class="page-header__title">Subnets</h1> |
2182 | <!-- XXX ricgard 2016-06-16 - Need to add e2e test. --> |
2183 | |
2184 | === modified file 'src/maasserver/static/partials/node-details.html' |
2185 | --- src/maasserver/static/partials/node-details.html 2017-04-20 08:58:42 +0000 |
2186 | +++ src/maasserver/static/partials/node-details.html 2017-04-25 09:34:40 +0000 |
2187 | @@ -1,12 +1,22 @@ |
2188 | +<<<<<<< TREE |
2189 | <div data-ng-if="!loaded"> |
2190 | <header class="page-header"> |
2191 | +======= |
2192 | +<div data-ng-hide="loaded"> |
2193 | + <header class="page-header" sticky> |
2194 | +>>>>>>> MERGE-SOURCE |
2195 | <div class="wrapper--inner"> |
2196 | <h1 class="page-header__title">Loading...</h1> |
2197 | </div> |
2198 | </header> |
2199 | </div> |
2200 | +<<<<<<< TREE |
2201 | <div data-ng-if="loaded"> |
2202 | <header sticky use-placeholder="true" media-query="min-width: 769px" class="page-header u-margin--bottom-none"> |
2203 | +======= |
2204 | +<div class="ng-hide" data-ng-show="loaded"> |
2205 | + <header class="page-header" sticky> |
2206 | +>>>>>>> MERGE-SOURCE |
2207 | <div class="wrapper--inner"> |
2208 | <h1 class="page-header__title"> |
2209 | <span contenteditable="true" |
2210 | @@ -45,6 +55,7 @@ |
2211 | </div> |
2212 | |
2213 | <!-- XXX blake_r 2015-02-19 - Need to add e2e test. --> |
2214 | +<<<<<<< TREE |
2215 | <div class="page-header__dropdown" data-ng-class="{ 'is-open': action.option }"> |
2216 | <div class="page-header__section twelve-col u-margin--bottom-none ng-hide" data-ng-if="!isDevice && !node.dhcp_on"> |
2217 | <p class="page-header__message page-header__message--warning">MAAS is not providing DHCP.</p> |
2218 | @@ -221,6 +232,97 @@ |
2219 | data-ng-class="{ 'is-active': section.area === 'power'}" |
2220 | data-ng-click="section.area = 'power'">Power</button> |
2221 | </nav> |
2222 | +======= |
2223 | + <div class="page-header__dropdown" data-ng-class="{ 'is-open': actionOption }"> |
2224 | + |
2225 | + <div class="page-header__section twelve-col u-margin--bottom-none ng-hide" data-ng-show="!node.dhcp_on"> |
2226 | + <p class="page-header__message page-header__message--warning"> |
2227 | + MAAS is not providing DHCP. |
2228 | + </p> |
2229 | + </div> |
2230 | + |
2231 | + <!-- XXX blake_r 2015-02-19 - Need to add e2e test. --> |
2232 | + <div class="page-header__section twelve-col u-margin--bottom-none ng-hide" data-ng-hide="isActionError() || isDeployError() || isSSHKeyError() || hasActionPowerError(actionOption.name)"> |
2233 | + <form class="form form--inline"> |
2234 | + <fieldset class="form__fieldset ng-hide" data-ng-show="actionOption.name === 'commission'"> |
2235 | + <div class="form__group"> |
2236 | + <input class="checkbox" id="enableSSH" type="checkbox" |
2237 | + data-ng-model="commissionOptions.enableSSH"> |
2238 | + <label for="enableSSH">Allow SSH access and prevent machine from powering off</label> |
2239 | + </div> |
2240 | + <div class="form__group"> |
2241 | + <input class="checkbox" id="skipNetworking" type="checkbox" |
2242 | + data-ng-model="commissionOptions.skipNetworking"> |
2243 | + <label for="skipNetworking">Retain network configuration</label> |
2244 | + </div> |
2245 | + <div class="form__group"> |
2246 | + <input class="checkbox" id="skipStorage" type="checkbox" |
2247 | + data-ng-model="commissionOptions.skipStorage"> |
2248 | + <label for="skipStorage">Retain storage configuration</label> |
2249 | + </div> |
2250 | + </fieldset> |
2251 | + <fieldset class="form__fieldset ng-hide" data-ng-show="actionOption.name === 'deploy'"> |
2252 | + <div class="form__group"> |
2253 | + <label for="image" class="form__group-label">Choose your image</label> |
2254 | + <div class="form__group-input"> |
2255 | + <span data-maas-os-select="osinfo" data-ng-model="osSelection"></span> |
2256 | + </div> |
2257 | + </div> |
2258 | + </fieldset> |
2259 | + <fieldset class="form__fieldset" data-ng-if="actionOption.name === 'release'"> |
2260 | + <div class="form__group"> |
2261 | + <span data-maas-release-options="releaseOptions"></span> |
2262 | + </div> |
2263 | + </fieldset> |
2264 | + <div class="page-header__controls"> |
2265 | + <a href="" class="button--base button--inline" data-ng-click="actionCancel()">Cancel</a> |
2266 | + <button class="button--primary button--inline" data-ng-click="actionGo()">Go</button> |
2267 | + </div> |
2268 | + </form> |
2269 | + </div> |
2270 | + |
2271 | + <!-- XXX blake_r 2015-02-19 - Need to add e2e test. --> |
2272 | + <div class="page-header__section twelve-col u-margin--bottom-none ng-hide" data-ng-show="isActionError()"> |
2273 | + <p class="page-header__message page-header__message--error"> |
2274 | + Node failed to be {$ actionOption.sentence $}, because of the following error: {$ actionError $} |
2275 | + </p> |
2276 | + <div class="page-header__controls"> |
2277 | + <a href="" class="button--base button--inline" data-ng-click="actionCancel()">Cancel</a> |
2278 | + <button class="button--primary button--inline" data-ng-click="actionGo()">Retry</button> |
2279 | + </div> |
2280 | + </div> |
2281 | + |
2282 | + <!-- XXX blake_r 2015-02-19 - Need to add e2e test. --> |
2283 | + <div class="page-header__section twelve-col u-margin--bottom-none ng-hide" data-ng-show="isDeployError()"> |
2284 | + <p class="page-header__message page-header__message--error"> |
2285 | + Node cannot be {$ actionOption.sentence $}, because the required boot images have not been imported. To import boot images, visit the <a href="images/">images page</a>. |
2286 | + </p> |
2287 | + <div class="page-header__controls"> |
2288 | + <a href="" class="button--base button--inline" data-ng-click="actionCancel()">Cancel</a> |
2289 | + </div> |
2290 | + </div> |
2291 | + |
2292 | + <div class="page-header__section twelve-col u-margin--bottom-none ng-hide" data-ng-show="hasActionPowerError(actionOption.name)"> |
2293 | + <p class="page-header__message page-header__message--error"> |
2294 | + Node cannot be {$ actionOption.sentence $}, because power control software for the |
2295 | + node is missing from its rack controller. To proceed, install the |
2296 | + {$ getPowerErrors() $} on the rack controller. |
2297 | + </p> |
2298 | + <div class="page-header__controls"> |
2299 | + <a href="" class="button--base button--inline" data-ng-click="actionCancel()">Cancel</a> |
2300 | + </div> |
2301 | + </div> |
2302 | + |
2303 | + <div class="page-header__section twelve-col u-margin--bottom-none ng-hide" data-ng-show="isSSHKeyError()"> |
2304 | + <p class="page-header__message page-header__message--error"> |
2305 | + Node cannot be {$ actionOption.sentence $}, because an SSH key has not been added to your account. To add an SSH key, visit <a href="account/prefs/">your account page</a>. |
2306 | + </p> |
2307 | + <div class="page-header__controls"> |
2308 | + <a href="" class="button--base button--inline" data-ng-click="actionCancel()">Cancel</a> |
2309 | + </div> |
2310 | + </div> |
2311 | + </div> |
2312 | +>>>>>>> MERGE-SOURCE |
2313 | </div> |
2314 | </div> |
2315 | <section class="row" data-ng-if="section.area === 'summary'"> |
2316 | |
2317 | === modified file 'src/maasserver/static/partials/node-events.html' |
2318 | --- src/maasserver/static/partials/node-events.html 2017-04-05 02:36:06 +0000 |
2319 | +++ src/maasserver/static/partials/node-events.html 2017-04-25 09:34:40 +0000 |
2320 | @@ -1,12 +1,20 @@ |
2321 | <div data-ng-hide="loaded"> |
2322 | +<<<<<<< TREE |
2323 | <header class="page-header" sticky media-query="min-width: 769px"> |
2324 | +======= |
2325 | + <header class="page-header" sticky> |
2326 | +>>>>>>> MERGE-SOURCE |
2327 | <div class="wrapper--inner"> |
2328 | <h1 class="page-header__title">Loading...</h1> |
2329 | </div> |
2330 | </header> |
2331 | </div> |
2332 | <div class="ng-hide" data-ng-show="loaded"> |
2333 | +<<<<<<< TREE |
2334 | <header class="page-header" sticky> |
2335 | +======= |
2336 | + <header class="page-header u-margin--bottom" sticky> |
2337 | +>>>>>>> MERGE-SOURCE |
2338 | <div class="wrapper--inner"> |
2339 | <h1 class="page-header__title">{$ node.fqdn $}</h1> |
2340 | <p class="page-header__status"> |
2341 | @@ -27,8 +35,13 @@ |
2342 | class="search__input" data-ng-model="search" /> |
2343 | <input type="submit" class="search__submit" /> |
2344 | </div> |
2345 | +<<<<<<< TREE |
2346 | <table id="events-listing" window-width> |
2347 | <thead data-ng-if="windowWidth >= 769" sticky sticky-class="table__head--sticky" offset="88" media-query="min-width: 768px"> |
2348 | +======= |
2349 | + <table id="events-listing"> |
2350 | + <thead sticky use-placeholder="false" sticky-class="table__head--sticky" offset="116"> |
2351 | +>>>>>>> MERGE-SOURCE |
2352 | <tr> |
2353 | <th class="table-col--1"></th> |
2354 | <th class="table-col--79">Event</th> |
2355 | |
2356 | === modified file 'src/maasserver/static/partials/node-result.html' |
2357 | --- src/maasserver/static/partials/node-result.html 2017-04-06 16:11:44 +0000 |
2358 | +++ src/maasserver/static/partials/node-result.html 2017-04-25 09:34:40 +0000 |
2359 | @@ -1,12 +1,20 @@ |
2360 | <div data-ng-hide="loaded"> |
2361 | +<<<<<<< TREE |
2362 | <header class="page-header" sticky media-query="min-width: 769px"> |
2363 | +======= |
2364 | + <header class="page-header" sticky> |
2365 | +>>>>>>> MERGE-SOURCE |
2366 | <div class="wrapper--inner"> |
2367 | <h1 class="page-header__title">Loading...</h1> |
2368 | </div> |
2369 | </header> |
2370 | </div> |
2371 | <div class="ng-hide" data-ng-show="loaded"> |
2372 | +<<<<<<< TREE |
2373 | <header class="page-header" sticky media-query="min-width: 769px"> |
2374 | +======= |
2375 | + <header class="page-header" sticky> |
2376 | +>>>>>>> MERGE-SOURCE |
2377 | <div class="wrapper--inner"> |
2378 | <h1 class="page-header__title">{$ node.fqdn $}</h1> |
2379 | <p class="page-header__status">{$ filename $}</p> |
2380 | |
2381 | === modified file 'src/maasserver/static/partials/nodes-list.html' |
2382 | --- src/maasserver/static/partials/nodes-list.html 2017-04-13 10:43:13 +0000 |
2383 | +++ src/maasserver/static/partials/nodes-list.html 2017-04-25 09:34:40 +0000 |
2384 | @@ -1,3 +1,4 @@ |
2385 | +<<<<<<< TREE |
2386 | <header class="page-header u-margin--bottom-none" sticky media-query="min-width: 769px"> |
2387 | <div class="wrapper--inner"> |
2388 | <!-- XXX ricgard 2016-06-16 - Need to add e2e test. --> |
2389 | @@ -941,3 +942,914 @@ |
2390 | </div> |
2391 | </div> |
2392 | </div> |
2393 | +======= |
2394 | +<header class="page-header" sticky> |
2395 | + <div class="wrapper--inner"> |
2396 | + <!-- XXX ricgard 2016-06-16 - Need to add e2e test. --> |
2397 | + <h1 class="page-header__title">{$ $parent.site $} MAAS</h1> |
2398 | + |
2399 | + <!-- XXX ricgard 2016-06-16 - Need to add e2e test. --> |
2400 | + <ul class="tabs"> |
2401 | + <!-- XXX ricgard 2016-06-16 - Need to add e2e test. --> |
2402 | + <li class="tabs__tab" |
2403 | + data-ng-class="{ 'is-active': currentpage === 'nodes' }"> |
2404 | + <a href="" |
2405 | + class="tabs__tab-link tooltip" |
2406 | + aria-label="A deployable node managed by MAAS." |
2407 | + data-ng-click="toggleTab('nodes')"> |
2408 | + {$ nodes.length $} <ng-pluralize count="nodes.length" when="{'one': 'Machine', 'other': 'Machines'}"></ng-pluralize> |
2409 | + </a> |
2410 | + </li> |
2411 | + <!-- XXX ricgard 2016-06-16 - Need to add e2e test. --> |
2412 | + <li class="tabs__tab" data-ng-class="{ 'is-active': currentpage === 'devices' }"> |
2413 | + <a href="" |
2414 | + class="tabs__tab-link tooltip" |
2415 | + aria-label="A node known to MAAS, but is not deployable." |
2416 | + data-ng-click="toggleTab('devices')"> |
2417 | + {$ devices.length $} <ng-pluralize count="devices.length" when="{'one': 'Device', 'other': 'Devices'}"></ng-pluralize> |
2418 | + </a> |
2419 | + </li> |
2420 | + <!-- XXX ricgard 2016-06-16 - Need to add e2e test. --> |
2421 | + <li class="tabs__tab" data-ng-if="isSuperUser()" |
2422 | + data-ng-class="{ 'is-active': currentpage === 'controllers' }"> |
2423 | + <a href="" |
2424 | + class="tabs__tab-link tooltip" |
2425 | + aria-label="A node that provides MAAS services." |
2426 | + data-ng-click="toggleTab('controllers')"> |
2427 | + {$ controllers.length $} <ng-pluralize count="controllers.length" when="{'one': 'Controller', 'other': 'Controllers'}"></ng-pluralize> |
2428 | + </a> |
2429 | + </li> |
2430 | + </ul> |
2431 | + |
2432 | + <!-- XXX ricgard 2016-06-16 - Need to add e2e test. --> |
2433 | + <p class="page-header__status" data-ng-show="loading"><span class="u-text--loading"><i class="icon icon--loading u-animation--spin"></i> Loading...</span></p> |
2434 | + |
2435 | + <!-- XXX ricgard 2016-06-16 - Need to add e2e test. --> |
2436 | + <div class="page-header__controls u-float--right" data-ng-show="currentpage === 'nodes'"> |
2437 | + <div data-ng-hide="tabs.nodes.selectedItems.length"> |
2438 | + <div data-maas-cta="addHardwareOptions" |
2439 | + data-ng-model="addHardwareOption" |
2440 | + data-ng-change="addHardwareOptionChanged()" data-default-title="Add hardware"> |
2441 | + </div> |
2442 | + </div> |
2443 | + <div class="ng-hide" data-ng-show="tabs.nodes.selectedItems.length"> |
2444 | + <span class="page-header__controls-feedback u-margin--right" data-ng-click="showSelected('nodes')"> |
2445 | + {$ tabs.nodes.selectedItems.length $} Selected |
2446 | + </span> |
2447 | + <div data-maas-cta="tabs.nodes.takeActionOptions" |
2448 | + data-ng-model="tabs.nodes.actionOption" |
2449 | + data-ng-change="actionOptionSelected('nodes')"> |
2450 | + </div> |
2451 | + </div> |
2452 | + </div> |
2453 | + |
2454 | + <!-- XXX ricgard 2016-06-16 - Need to add e2e test. --> |
2455 | + <div class="page-header__controls u-float--right" data-ng-show="currentpage === 'devices'"> |
2456 | + <div data-ng-hide="tabs.devices.selectedItems.length"> |
2457 | + <button class="button--primary button--inline" |
2458 | + data-ng-click="addDevice()" |
2459 | + data-ng-hide="addDeviceScope.viewable">Add Device</button> |
2460 | + <button class="button--secondary button--inline ng-hide" |
2461 | + data-ng-click="cancelAddDevice()" |
2462 | + data-ng-show="addDeviceScope.viewable">Cancel add device</button> |
2463 | + </div> |
2464 | + <div data-ng-show="tabs.devices.selectedItems.length"> |
2465 | + <span class="page-header__controls-feedback u-margin--right" data-ng-click="showSelected('devices')"> |
2466 | + {$ tabs.devices.selectedItems.length $} Selected |
2467 | + </span> |
2468 | + <div data-maas-cta="tabs.devices.takeActionOptions" |
2469 | + data-ng-model="tabs.devices.actionOption" |
2470 | + data-ng-change="actionOptionSelected('devices')"> |
2471 | + </div> |
2472 | + </div> |
2473 | + </div> |
2474 | + |
2475 | + <!-- XXX ricgard 2016-06-16 - Need to add e2e test. --> |
2476 | + <div class="page-header__controls u-float--right" data-ng-show="currentpage === 'controllers'"> |
2477 | + <div data-ng-if="!tabs.controllers.selectedItems.length"> |
2478 | + <button class="button--primary button--inline" |
2479 | + data-ng-click="tabs.controllers.addController = true" |
2480 | + data-ng-hide="tabs.controllers.addController">Add rack controller</button> |
2481 | + <button class="button--secondary button--inline ng-hide" |
2482 | + data-ng-click="tabs.controllers.addController = false" |
2483 | + data-ng-show="tabs.controllers.addController">Close add rack controller</button> |
2484 | + </div> |
2485 | + <div data-ng-show="tabs.controllers.selectedItems.length"> |
2486 | + <span class="page-header__controls-feedback u-margin--right" data-ng-click="showSelected('controllers')"> |
2487 | + {$ tabs.controllers.selectedItems.length $} Selected |
2488 | + </span> |
2489 | + <div data-maas-cta="tabs.controllers.takeActionOptions" |
2490 | + data-ng-model="tabs.controllers.actionOption" |
2491 | + data-ng-change="actionOptionSelected('controllers')"> |
2492 | + </div> |
2493 | + </div> |
2494 | + </div> |
2495 | + |
2496 | + <!-- XXX ricgard 2016-06-16 - Need to add e2e test. --> |
2497 | + <div class="page-header__dropdown" data-ng-class="{ 'is-open': tabs.nodes.actionOption }"> |
2498 | + <!-- XXX ricgard 2016-06-16 - Need to add e2e test. --> |
2499 | + <section class="page-header__section twelve-col u-margin--bottom-none" data-ng-hide="isActionError('nodes') || hasActionsInProgress('nodes')"> |
2500 | + <form class="form form--inline"> |
2501 | + <fieldset class="form__fieldset ng-hide" data-ng-show="tabs.nodes.actionOption.name === 'commission'"> |
2502 | + <div class="form__group"> |
2503 | + <input class="form__group-label" id="enableSSH" type="checkbox" |
2504 | + data-ng-model="tabs.nodes.commissionOptions.enableSSH"> |
2505 | + <label class="checkbox-label" for="enableSSH">Allow SSH access and prevent machine from powering off</label> |
2506 | + </div> |
2507 | + <div class="form__group"> |
2508 | + <input class="form__group-label" id="skipNetworking" type="checkbox" |
2509 | + data-ng-model="tabs.nodes.commissionOptions.skipNetworking"> |
2510 | + <label class="checkbox-label" for="skipNetworking">Retain network configuration</label> |
2511 | + </div> |
2512 | + <div class="form__group"> |
2513 | + <input class="form__group-label" id="skipStorage" type="checkbox" |
2514 | + data-ng-model="tabs.nodes.commissionOptions.skipStorage"> |
2515 | + <label class="checkbox-label" for="skipStorage">Retain storage configuration</label> |
2516 | + </div> |
2517 | + </fieldset> |
2518 | + <fieldset class="form__fieldset ng-hide" data-ng-show="tabs.nodes.actionOption.name === 'deploy'"> |
2519 | + <div class="form__group"> |
2520 | + <label for="image" class="form__group-label">Choose your image</label> |
2521 | + <div class="form__group-input"> |
2522 | + <span data-maas-os-select="osinfo" data-ng-model="tabs.nodes.osSelection"></span> |
2523 | + </div> |
2524 | + </div> |
2525 | + </fieldset> |
2526 | + <fieldset class="form__fieldset" data-ng-if="tabs.nodes.actionOption.name === 'release'"> |
2527 | + <div class="form__group"> |
2528 | + <span data-maas-release-options="tabs.nodes.releaseOptions"></span> |
2529 | + </div> |
2530 | + </fieldset> |
2531 | + <fieldset class="form__fieldset ng-hide" data-ng-show="tabs.nodes.actionOption.name === 'set-zone'"> |
2532 | + <div class="form__group"> |
2533 | + <label for="zone" class="form__group-label">Select Zone</label> |
2534 | + <div class="form__group-input"> |
2535 | + <select name="zone" id="zone" placeholder="Choose a zone" |
2536 | + data-ng-model="tabs.nodes.zoneSelection" |
2537 | + data-ng-options="zone as zone.name for zone in zones"> |
2538 | + <option value="" disabled="disabled">Choose a zone</option> |
2539 | + </select> |
2540 | + </div> |
2541 | + </div> |
2542 | + </fieldset> |
2543 | + <div class="page-header__controls"> |
2544 | + <a href="" class="button--base button--inline" data-ng-click="actionCancel('nodes')">Cancel</a> |
2545 | + <button class="button--primary button--inline" data-ng-click="actionGo('nodes')" data-ng-hide="hasActionsFailed('nodes')">Go</button> |
2546 | + <button class="button--primary button--inline" data-ng-click="actionGo('nodes')" data-ng-show="hasActionsFailed('nodes')">Retry</button> |
2547 | + </div> |
2548 | + </form> |
2549 | + </section> |
2550 | + |
2551 | + <!-- XXX ricgard 2016-06-16 - Need to add e2e test. --> |
2552 | + <section class="page-header__section twelve-col u-margin--bottom-none ng-hide" data-ng-show="isActionError('nodes')"> |
2553 | + <p data-ng-hide="isDeployError('nodes') || isSSHKeyError('nodes')" |
2554 | + class="page-header__message page-header__message--error ng-hide"> |
2555 | + {$ tabs.nodes.actionErrorCount $} |
2556 | + <span data-ng-pluralize count="tabs.nodes.selectedItems.length" when="{'one': 'node', 'other': 'nodes'}"></span> |
2557 | + cannot be {$ tabs.nodes.actionOption.sentence $}. To proceed, update your selection. |
2558 | + </p> |
2559 | + <p class="page-header__message page-header__message--error ng-hide" data-ng-show="isDeployError('nodes')"> |
2560 | + {$ tabs.nodes.selectedItems.length $} |
2561 | + <span data-ng-pluralize count="tabs.nodes.selectedItems.length" when="{'one': 'node', 'other': 'nodes'}"></span> |
2562 | + cannot be {$ tabs.nodes.actionOption.sentence $}, because the required boot images have not been imported. To import boot images, visit the <a href="#/images">images page</a>. |
2563 | + </p> |
2564 | + <p class="page-header__message page-header__message--error ng-hide" data-ng-show="isSSHKeyError('nodes')"> |
2565 | + {$ tabs.nodes.selectedItems.length $} |
2566 | + <span data-ng-pluralize count="tabs.nodes.selectedItems.length" when="{'one': 'node', 'other': 'nodes'}"></span> |
2567 | + cannot be {$ tabs.nodes.actionOption.sentence $}, because an SSH key has not been added to your account. To add an SSH key, visit <a href="account/prefs/">your account page</a>. |
2568 | + </p> |
2569 | + </section> |
2570 | + |
2571 | + <!-- XXX ricgard 2016-06-16 - Need to add e2e test. --> |
2572 | + <section class="page-header__section twelve-col u-margin--bottom-none ng-hide" data-ng-show="hasActionsInProgress('nodes') || hasActionsFailed('nodes')"> |
2573 | + <p class="page-header__message" data-ng-show="hasActionsInProgress('nodes')"> |
2574 | + <i class="icon icon--loading u-animation--spin"></i> |
2575 | + {$ tabs.nodes.actionProgress.completed $} of {$ tabs.nodes.actionProgress.total $} |
2576 | + nodes are transitioning to {$ tabs.nodes.actionOption.sentence $}. |
2577 | + </p> |
2578 | + <p class="page-header__message page-header__message--error" |
2579 | + data-ng-repeat="(error, nodes) in tabs.nodes.actionProgress.errors"> |
2580 | + The {$ tabs.nodes.actionOption.title.toLowerCase() $} action for {$ nodes.length $} |
2581 | + <span data-ng-pluralize count="nodes.length" when="{'one': 'node', 'other': 'nodes'}"></span> |
2582 | + failed with error: {$ error $} |
2583 | + </p> |
2584 | + </section> |
2585 | + </div> |
2586 | + |
2587 | + <!-- XXX ricgard 2016-06-16 - Need to add e2e test. --> |
2588 | + <div class="page-header__dropdown" data-ng-class="{ 'is-open': addHardwareScope.viewable }" data-ng-controller="AddHardwareController"> |
2589 | + <!-- XXX ricgard 2016-06-16 - Need to add e2e test. --> |
2590 | + <section class="page-header__section twelve-col u-margin--bottom-none ng-hide" data-ng-show="showMachine()"> |
2591 | + <h3 class="page-header__dropdown-title">Add machine</h3> |
2592 | + <form class="form form--stack"> |
2593 | + <fieldset class="form__fieldset six-col"> |
2594 | + <div class="form__group"> |
2595 | + <label for="machine-name" class="form__label two-col">Machine name</label> |
2596 | + <div class="form__group-input three-col"> |
2597 | + <input type="text" id="machine-name" placeholder="Choose a machine name (optional)" |
2598 | + data-ng-model="machine.name"> |
2599 | + </div> |
2600 | + </div> |
2601 | + <div class="form__group"> |
2602 | + <label for="domain" class="form__group-label two-col">Domain</label> |
2603 | + <div class="form__group-input three-col"> |
2604 | + <select name="domain" id="domain" |
2605 | + data-ng-model="machine.domain" |
2606 | + data-ng-options="domain as domain.name for domain in domains"> |
2607 | + <option value="" disabled>Choose a domain</option> |
2608 | + </select> |
2609 | + </div> |
2610 | + </div> |
2611 | + <div class="form__group"> |
2612 | + <label for="architecture" class="form__group-label two-col">Architecture</label> |
2613 | + <div class="form__group-input three-col"> |
2614 | + <select name="architecture" id="architecture" |
2615 | + data-ng-model="machine.architecture" |
2616 | + data-ng-options="arch for arch in architectures"> |
2617 | + <option value="" disabled>Choose an architecture</option> |
2618 | + </select> |
2619 | + </div> |
2620 | + </div> |
2621 | + <div class="form__group"> |
2622 | + <label for="min_hwe_kernel" class="form__group-label two-col">Minimum Kernel</label> |
2623 | + <div class="form__group-input three-col"> |
2624 | + <select name="min_hwe_kernel" id="min_hwe_kernel" placeholder="No minimum kernel" |
2625 | + data-ng-model="machine.min_hwe_kernel" |
2626 | + data-ng-options="hwe_kernel[0] as hwe_kernel[1] for hwe_kernel in hwe_kernels"> |
2627 | + <option value="">No minimum kernel</option> |
2628 | + </select> |
2629 | + </div> |
2630 | + </div> |
2631 | + <div class="form__group"> |
2632 | + <label for="zone" class="form__group-label two-col">Zone</label> |
2633 | + <select name="zone" id="zone" class="three-col" placeholder="Choose a zone" |
2634 | + data-ng-model="machine.zone" |
2635 | + data-ng-options="zone as zone.name for zone in zones"> |
2636 | + </select> |
2637 | + </div> |
2638 | + <div class="form__group" data-ng-repeat="mac in machine.macs"> |
2639 | + <label for="mac-address" class="form__group-label two-col"><span data-ng-hide="mac !== machine.macs[0]">MAC Address</span> </label> |
2640 | + <div class="form__group-input three-col"> |
2641 | + <input type="text" id="mac-address" placeholder="00:00:00:00:00:00" |
2642 | + data-ng-class="{ 'has-error': mac.error }" |
2643 | + data-ng-model="mac.mac" data-ng-change="validateMac(mac)"> |
2644 | + <span class="form__group-remove" title="Delete MAC" |
2645 | + data-ng-hide="mac === machine.macs[0]" data-ng-click="removeMac(mac)"></span> |
2646 | + </div> |
2647 | + </div> |
2648 | + <div class="form__group"> |
2649 | + <div class="five-col"> |
2650 | + <a href="" class="button--secondary button--inline u-float--right" data-ng-click="addMac()">+ Add MAC Address</a> |
2651 | + </div> |
2652 | + </div> |
2653 | + </fieldset> |
2654 | + <fieldset class="form__fieldset six-col last-col" |
2655 | + data-maas-power-parameters="power_types" |
2656 | + data-ng-model="machine.power"> |
2657 | + </fieldset> |
2658 | + </form> |
2659 | + </section> |
2660 | + <section class="page-header__section twelve-col u-margin--bottom-none ng-hide" data-ng-show="showChassis()"> |
2661 | + <h3 class="page-header__dropdown-title">Add chassis</h3> |
2662 | + <form action="post" class="form form--stack"> |
2663 | + <fieldset class="form__fieldset six-col" |
2664 | + data-maas-power-parameters="chassisPowerTypes" |
2665 | + data-ng-model="chassis.power"> |
2666 | + </fieldset> |
2667 | + <fieldset class="form__fieldset six-col last-col"> |
2668 | + <div class="form__group"> |
2669 | + <label for="domain" class="form__group-label two-col">Domain</label> |
2670 | + <div class="form__group-input three-col"> |
2671 | + <select name="domain" id="domain" placeholder="Choose a domain" |
2672 | + data-ng-model="chassis.domain" |
2673 | + data-ng-options="domain as domain.name for domain in domains"> |
2674 | + </select> |
2675 | + </div> |
2676 | + </div> |
2677 | + </fieldset> |
2678 | + </form> |
2679 | + </section> |
2680 | + |
2681 | + <!-- XXX ricgard 2016-06-16 - Need to add e2e test. --> |
2682 | + <section class="page-header__section twelve-col u-margin--bottom-none" data-ng-show="showMachine()"> |
2683 | + <p class="page-header__message page-header__message--error ng-hide" data-ng-show="error">{$ error $}</p> |
2684 | + <div class="page-header__controls"> |
2685 | + <a href="" class="button--base button--inline" data-ng-click="cancel()">Cancel</a> |
2686 | + <button class="button--secondary button--inline" |
2687 | + data-ng-class="{ disabled: machineHasError() }" |
2688 | + data-ng-click="saveMachine(true)">Save and add another</button> |
2689 | + <button class="button--primary button--inline" |
2690 | + data-ng-class="{ disabled: machineHasError() }" |
2691 | + data-ng-click="saveMachine(false)">Save machine</button> |
2692 | + </div> |
2693 | + </section> |
2694 | + |
2695 | + <!-- XXX ricgard 2016-06-16 - Need to add e2e test. --> |
2696 | + <section class="page-header__section twelve-col u-margin--bottom-none ng-hide" data-ng-show="showChassis()"> |
2697 | + <p class="page-header__message page-header__message--error ng-hide" data-ng-show="error">{$ error $}</p> |
2698 | + <div class="page-header__controls"> |
2699 | + <a href="" class="button--base button--inline" data-ng-click="cancel()">Cancel</a> |
2700 | + <button class="button--secondary button--inline" |
2701 | + data-ng-class="{ disabled: chassisHasErrors() }" |
2702 | + data-ng-click="saveChassis(true)">Save and add another</button> |
2703 | + <button class="button--primary button--inline" |
2704 | + data-ng-class="{ disabled: chassisHasErrors() }" |
2705 | + data-ng-click="saveChassis(false)">Save chassis</button> |
2706 | + </div> |
2707 | + </section> |
2708 | + |
2709 | + <!-- XXX ricgard 2016-06-16 - Need to add e2e test. --> |
2710 | + <section class="page-header__section twelve-col u-margin--bottom-none" data-ng-hide="architectures.length"> |
2711 | + <p class="page-header__message page-header__message--error"> |
2712 | + Cannot add {$ mode $} until boot images have been imported. To fix, visit the <a href="#/images">images page</a>. |
2713 | + </p> |
2714 | + </section> |
2715 | + </div> |
2716 | + |
2717 | + <!-- XXX blake_r 2015-04-02 - Need to add e2e test. --> |
2718 | + <div class="page-header__dropdown" data-ng-class="{ 'is-open': tabs.devices.actionOption }"> |
2719 | + <!-- XXX blake_r 2015-04-02 - Need to add e2e test. --> |
2720 | + <div class="page-header__section twelve-col u-margin--bottom-none ng-hide" data-ng-hide="isActionError('devices') || hasActionsInProgress('devices')"> |
2721 | + <!-- XXX blake_r 2015-04-02 - Need to add e2e test. --> |
2722 | + <form class="form form--inline"> |
2723 | + <fieldset class="form__fieldset ng-hide" data-ng-show="tabs.devices.actionOption.name === 'set-zone'"> |
2724 | + <div class="form__group"> |
2725 | + <label class="form__group-label" for="zone">Set zone</label> |
2726 | + <select name="zone" id="zone" placeholder="Choose a zone" |
2727 | + data-ng-model="tabs.devices.zoneSelection" |
2728 | + data-ng-options="zone as zone.name for zone in zones"> |
2729 | + <option value="" disabled="disabled">Choose a zone</option> |
2730 | + </select> |
2731 | + </div> |
2732 | + </fieldset> |
2733 | + <div class="page-header__controls"> |
2734 | + <a href="" class="button--base button--inline" data-ng-click="actionCancel('devices')">Cancel</a> |
2735 | + <button class="button--primary button--inline" data-ng-click="actionGo('devices')">Go</button> |
2736 | + </div> |
2737 | + </form> |
2738 | + </div> |
2739 | + |
2740 | + <!-- XXX blake_r 2015-04-02 - Need to add e2e test. --> |
2741 | + <div class="page-header__section twelve-col u-margin--bottom-none ng-hide" data-ng-show="isActionError('devices')"> |
2742 | + <p class="page-header__message page-header__message--error"> |
2743 | + {$ tabs.devices.actionErrorCount $} |
2744 | + <span data-ng-pluralize count="tabs.devices.selectedItems.length" when="{'one': 'device', 'other': 'devices'}"></span> |
2745 | + cannot be {$ tabs.devices.actionOption.sentence $}. To proceed, update your selection. |
2746 | + </p> |
2747 | + </div> |
2748 | + |
2749 | + <!-- XXX blake_r 2015-05-07 - Need to add e2e test. --> |
2750 | + <div class="page-header__section twelve-col u-margin--bottom-none ng-hide" data-ng-show="hasActionsInProgress('devices') || hasActionsFailed('devices')"> |
2751 | + <p class="page-header__message" data-ng-show="hasActionsInProgress('devices')"> |
2752 | + <i class="icon icon--loading u-animation--spin"></i> |
2753 | + {$ tabs.devices.actionProgress.completed $} of {$ tabs.devices.actionProgress.total $} |
2754 | + devices have been {$ tabs.devices.actionOption.sentence $}. |
2755 | + </p> |
2756 | + <p class="page-header__message page-header__message--error" |
2757 | + data-ng-repeat="(error, devices) in tabs.devices.actionProgress.errors"> |
2758 | + The {$ tabs.devices.actionOption.title.toLowerCase() $} action for {$ devices.length $} |
2759 | + <span data-ng-pluralize count="devices.length" when="{'one': 'device', 'other': 'devices'}"></span> |
2760 | + failed with error: {$ error $} |
2761 | + </p> |
2762 | + </div> |
2763 | + </div> |
2764 | + |
2765 | + <!-- XXX ricgard 2016-06-16 - Need to add e2e test. --> |
2766 | + <div class="page-header__dropdown" data-ng-class="{ 'is-open': addDeviceScope.viewable }" data-ng-controller="AddDeviceController"> |
2767 | + <section class="page-header__section twelve-col u-margin--bottom-none"> |
2768 | + <h3 class="page-header__dropdown-title">Add device</h3> |
2769 | + <form action="" class="form form--stack"> |
2770 | + <fieldset class="form__fieldset six-col"> |
2771 | + <div class="form__group"> |
2772 | + <label for="device-name" class="form__group-label two-col">Name</label> |
2773 | + <div class="form__group-input three-col"> |
2774 | + <input type="text" id="device-name" placeholder="Name your device" |
2775 | + data-ng-model="device.name" |
2776 | + data-ng-class="{ 'has-error': nameHasError() }"> |
2777 | + </div> |
2778 | + |
2779 | + </div> |
2780 | + <div class="form__group"> |
2781 | + <label for="domain" class="form__group-label two-col">Domain</label> |
2782 | + <div class="form__group-input three-col"> |
2783 | + <select name="domain" id="domain" placeholder="Choose a domain" |
2784 | + data-ng-model="device.domain" |
2785 | + data-ng-options="domain as domain.name for domain in domains"> |
2786 | + </select> |
2787 | + </div> |
2788 | + </div> |
2789 | + </fieldset> |
2790 | + </form> |
2791 | + <table> |
2792 | + <thead> |
2793 | + <tr> |
2794 | + <th class="table-col--20">MAC address</th> |
2795 | + <th class="table-col--20">IP assignment</th> |
2796 | + <th class="table-col--20">Subnet</th> |
2797 | + <th class="table-col--35">IP address</th> |
2798 | + <th class="table-col--5"></th> |
2799 | + </tr> |
2800 | + </thead> |
2801 | + <tbody> |
2802 | + <tr data-ng-repeat="interface in device.interfaces"> |
2803 | + <td class="table-col--20"> |
2804 | + <input type="text" id="mac-address" placeholder="00:00:00:00:00:00" |
2805 | + data-ng-model="interface.mac" |
2806 | + data-ng-class="{ 'has-error': macHasError(interface) }"> |
2807 | + </td> |
2808 | + <td class="table-col--20"> |
2809 | + <select name="ip-assignment" id="ip-assignment" |
2810 | + placeholder="Select IP assignment" data-ng-model="interface.ipAssignment" |
2811 | + data-ng-options="assigment.title for assigment in ipAssignments"> |
2812 | + <option value="" disabled selected>Select IP assignment</option> |
2813 | + </select> |
2814 | + </td> |
2815 | + <td class="table-col--20"> |
2816 | + <select name="subnet" id="subnet" |
2817 | + placeholder="Select subnet" data-ng-model="interface.subnetId" |
2818 | + data-ng-options="subnet.id as subnet.name for subnet in subnets" |
2819 | + data-ng-show="interface.ipAssignment.name === 'static'"> |
2820 | + <option value="" disabled selected>Select subnet</option> |
2821 | + </select> |
2822 | + </td> |
2823 | + <td class="table-col--35"> |
2824 | + <input type="text" id="ip-address" placeholder="000.000.000.000" |
2825 | + data-ng-model="interface.ipAddress" |
2826 | + data-ng-class="{ 'has-error': ipHasError(interface) }" |
2827 | + data-ng-show="interface.ipAssignment.name === 'external'"> |
2828 | + <input type="text" id="ip-address" |
2829 | + data-ng-model="interface.ipAddress" |
2830 | + data-ng-class="{ 'has-error': ipHasError(interface) }" |
2831 | + data-ng-show="interface.ipAssignment.name === 'static'"> |
2832 | + </td> |
2833 | + <td class="table-col--5 u-u-align---right"> |
2834 | + <!-- space needed to set correct height --> |
2835 | + <span data-ng-show="isPrimaryInterface(interface)"> </span> |
2836 | + <a title="icon icon--delete" class="icon icon--remove" |
2837 | + data-ng-click="deleteInterface(interface)" |
2838 | + data-ng-hide="isPrimaryInterface(interface)">delete</a> |
2839 | + </td> |
2840 | + </tr> |
2841 | + </tbody> |
2842 | + </table> |
2843 | + <button class="button--secondary button--inline" data-ng-click="addInterface()">+ Add another interface</button> |
2844 | + </section> |
2845 | + <section class="page-header__section twelve-col u-margin--bottom-none twelve-col u-margin--bottom-none"> |
2846 | + <form class="form form--inline"> |
2847 | + <p class="page-header__message page-header__message--error ng-hide" data-ng-show="error">{$ error $}</p> |
2848 | + <div class="page-header__controls"> |
2849 | + <a href="" class="button--base button--inline" data-ng-click="cancel()">Cancel</a> |
2850 | + <button class="button--secondary button--inline" |
2851 | + data-ng-class="{ disabled: deviceHasError() }" |
2852 | + data-ng-click="save(true)">Save and add another</button> |
2853 | + <button class="button--primary button--inline" |
2854 | + data-ng-class="{ disabled: deviceHasError() }" |
2855 | + data-ng-click="save(false)">Save device</button> |
2856 | + </div> |
2857 | + </form> |
2858 | + </section> |
2859 | + </div> |
2860 | + |
2861 | + <!-- XXX blake_r 2015-04-02 - Need to add e2e test. --> |
2862 | + <div class="page-header__dropdown" data-ng-class="{ 'is-open': tabs.controllers.actionOption }"> |
2863 | + <!-- XXX blake_r 2015-04-02 - Need to add e2e test. --> |
2864 | + <div class="page-header__section twelve-col u-margin--bottom-none ng-hide" data-ng-hide="isActionError('controllers') || hasActionsInProgress('controllers')"> |
2865 | + <!-- XXX blake_r 2015-04-02 - Need to add e2e test. --> |
2866 | + <form class="form form--inline"> |
2867 | + <fieldset class="form__fieldset ng-hide" data-ng-show="tabs.controllers.actionOption.name === 'set-zone'"> |
2868 | + <div class="form__group"> |
2869 | + <label for="zone" class="form__group-label">Select Zone</label> |
2870 | + <div class="form__group-input"> |
2871 | + <select name="zone" id="zone" placeholder="Choose a zone" |
2872 | + data-ng-model="tabs.controllers.zoneSelection" |
2873 | + data-ng-options="zone as zone.name for zone in zones"> |
2874 | + <option value="" disabled="disabled">Choose a zone</option> |
2875 | + </select> |
2876 | + </div> |
2877 | + </div> |
2878 | + </fieldset> |
2879 | + <div class="page-header__controls"> |
2880 | + <a href="" class="button--base button--inline" data-ng-click="actionCancel('controllers')">Cancel</a> |
2881 | + <button class="button--primary button--inline" data-ng-click="actionGo('controllers')">Go</button> |
2882 | + </div> |
2883 | + </form> |
2884 | + </div> |
2885 | + |
2886 | + <!-- XXX blake_r 2015-04-02 - Need to add e2e test. --> |
2887 | + <div class="page-header__section twelve-col u-margin--bottom-none ng-hide" data-ng-show="isActionError('controllers')"> |
2888 | + <form class="form form--inline"> |
2889 | + <p class="page-header__message page-header__message--error"> |
2890 | + {$ tabs.controllers.actionErrorCount $} |
2891 | + <span data-ng-pluralize count="tabs.controllers.selectedItems.length" when="{'one': 'controller', 'other': 'controllers'}"></span> |
2892 | + cannot be {$ tabs.controllers.actionOption.sentence $}. To proceed, update your selection. |
2893 | + </p> |
2894 | + </form> |
2895 | + </div> |
2896 | + |
2897 | + <!-- XXX blake_r 2015-05-07 - Need to add e2e test. --> |
2898 | + <div class="page-header__section twelve-col u-margin--bottom-none ng-hide" data-ng-show="hasActionsInProgress('controllers') || hasActionsFailed('controllers')"> |
2899 | + <form class="form form--inline"> |
2900 | + <p class="page-header__message" data-ng-show="hasActionsInProgress('controllers')"> |
2901 | + <i class="icon icon--loading u-animation--spin u-margin--right-small"></i> |
2902 | + {$ tabs.controllers.actionProgress.completed $} of {$ tabs.controllers.actionProgress.total $} |
2903 | + controllers have been {$ tabs.controllers.actionOption.sentence $}. |
2904 | + </p> |
2905 | + <p class="page-header__message page-header__message--error" |
2906 | + data-ng-repeat="(error, controllers) in tabs.controllers.actionProgress.errors"> |
2907 | + The {$ tabs.controllers.actionOption.title.toLowerCase() $} action for {$ controllers.length $} |
2908 | + <span data-ng-pluralize count="controllers.length" when="{'one': 'controller', 'other': 'controllers'}"></span> |
2909 | + failed with error: {$ error $} |
2910 | + </p> |
2911 | + </form> |
2912 | + </div> |
2913 | + </div> |
2914 | + |
2915 | + <div class="page-header__dropdown" data-ng-class="{ 'is-open': tabs.controllers.addController }"> |
2916 | + |
2917 | + <!-- XXX blake_r 2015-05-07 - Need to add e2e test. --> |
2918 | + <div class="page-header__section twelve-col u-margin--bottom-none ng-hide" data-ng-show="tabs.controllers.addController"> |
2919 | + <h3 class="page-header__dropdown-title">Add rack controller</h3> |
2920 | + <form class="form"> |
2921 | + <pre class="u-margin--none"> |
2922 | +<code># To add a new rack controller, SSH into the rack controller. |
2923 | +# Install the maas-rack-controller package. |
2924 | +sudo apt install maas-rack-controller |
2925 | +# Register the rack controller with this MAAS. If the rack controller (and machines) |
2926 | +# don't have access to the URL, use a different IP address to allow connection. |
2927 | +sudo maas-rack register --url {$ tabs.controllers.registerUrl $} --secret {$ tabs.controllers.registerSecret $}</code> |
2928 | + </pre> |
2929 | + </form> |
2930 | + </div> |
2931 | + <div class="page-header__section twelve-col u-margin--bottom-none ng-hide" data-ng-show="tabs.controllers.addController"> |
2932 | + <form class="form form--inline"> |
2933 | + <div class="page-header__controls"> |
2934 | + <button class="button--secondary button--inline" |
2935 | + data-ng-click="tabs.controllers.addController = false">Close</button> |
2936 | + </div> |
2937 | + </form> |
2938 | + </div> |
2939 | + </div> |
2940 | + </div> |
2941 | +</header> |
2942 | +<div class="row u-padding--top-none"> |
2943 | + <div class="wrapper--inner"> |
2944 | + <aside class="three-col"> |
2945 | + <div class="accordion maas-accordion" data-ng-show="currentpage === 'nodes'" |
2946 | + data-ng-class="{ 'is-disabled': tabs.nodes.actionOption }"> |
2947 | + <h3 class="accordion__title">Filter by</h3> |
2948 | + <!-- XXX ricgard 2016-06-16 - Need to add e2e test. --> |
2949 | + <div class="ng-hide accordion__tab" data-ng-show="tabs.nodes.metadata.status.length"> |
2950 | + <h4 class="accordion__tab-title maas-accordion-tab is-active">Status</h4> |
2951 | + <div class="accordion__tab-content"> |
2952 | + <ul class="accordion__tab-list"> |
2953 | + <!-- XXX ricgard 2016-06-16 - Need to add e2e test. --> |
2954 | + <li class="accordion__tab-item" data-ng-repeat="status in tabs.nodes.metadata.status | orderBy:['name', '-count']" data-ng-class="{ 'is-active': isFilterActive('status', status.name, 'nodes') }"> |
2955 | + <a class="accordion__tab-link" href="" data-ng-click="toggleFilter('status', status.name, 'nodes')">{$ status.name $} ({$ status.count $})</a> |
2956 | + </li> |
2957 | + </ul> |
2958 | + </div> |
2959 | + </div> |
2960 | + <div class="ng-hide accordion__tab" data-ng-show="tabs.nodes.metadata.owner.length"> |
2961 | + <h4 class="accordion__tab-title maas-accordion-tab">Owner</h4> |
2962 | + <div class="accordion__tab-content"> |
2963 | + <ul class="accordion__tab-list"> |
2964 | + <li class="accordion__tab-item" data-ng-repeat="owner in tabs.nodes.metadata.owner | orderBy:['name', '-count']" data-ng-class="{ 'is-active': isFilterActive('owner', owner.name, 'nodes') }"> |
2965 | + <a class="accordion__tab-link" href="" data-ng-click="toggleFilter('owner', owner.name, 'nodes')">{$ owner.name $} ({$ owner.count $})</a> |
2966 | + </li> |
2967 | + </ul> |
2968 | + </div> |
2969 | + </div> |
2970 | + <div class="ng-hide accordion__tab" data-ng-show="tabs.nodes.metadata.release.length"> |
2971 | + <h4 class="accordion__tab-title maas-accordion-tab">OS/Release</h4> |
2972 | + <div class="accordion__tab-content"> |
2973 | + <ul class="accordion__tab-list"> |
2974 | + <li class="accordion__tab-item" data-ng-repeat="release in tabs.nodes.metadata.release | orderBy:['name', '-count']" data-ng-class="{ 'is-active': isFilterActive('release', release.name, 'nodes') }"> |
2975 | + <a class="accordion__tab-link" href="" data-ng-click="toggleFilter('release', release.name, 'nodes')">{$ getReleaseTitle(release.name) $} ({$ release.count $})</a> |
2976 | + </li> |
2977 | + </ul> |
2978 | + </div> |
2979 | + </div> |
2980 | + <div class="ng-hide accordion__tab" data-ng-show="tabs.nodes.metadata.tags.length"> |
2981 | + <h4 class="accordion__tab-title maas-accordion-tab">Tags</h4> |
2982 | + <div class="accordion__tab-content"> |
2983 | + <ul class="accordion__tab-list"> |
2984 | + <li class="accordion__tab-item" data-ng-repeat="tag in tabs.nodes.metadata.tags | orderBy:['name', '-count']" data-ng-class="{ 'is-active': isFilterActive('tags', tag.name, 'nodes') }"> |
2985 | + <a class="accordion__tab-link" href="" data-ng-click="toggleFilter('tags', tag.name, 'nodes')">{$ tag.name $} ({$ tag.count $})</a> |
2986 | + </li> |
2987 | + </ul> |
2988 | + </div> |
2989 | + </div> |
2990 | + <div class="ng-hide accordion__tab" data-ng-show="tabs.nodes.metadata.storage_tags.length"> |
2991 | + <h4 class="accordion__tab-title maas-accordion-tab">Storage Tags</h4> |
2992 | + <div class="accordion__tab-content"> |
2993 | + <ul class="accordion__tab-list"> |
2994 | + <li class="accordion__tab-item" data-ng-repeat="tag in tabs.nodes.metadata.storage_tags | orderBy:['name', '-count']" data-ng-class="{ 'is-active': isFilterActive('storage_tags', tag.name, 'nodes') }"> |
2995 | + <a class="accordion__tab-link" href="" data-ng-click="toggleFilter('storage_tags', tag.name, 'nodes')">{$ tag.name $} ({$ tag.count $})</a> |
2996 | + </li> |
2997 | + </ul> |
2998 | + </div> |
2999 | + </div> |
3000 | + <div class="ng-hide accordion__tab" data-ng-show="tabs.nodes.metadata.subnets.length"> |
3001 | + <h4 class="accordion__tab-title maas-accordion-tab">Subnets</h4> |
3002 | + <div class="accordion__tab-content"> |
3003 | + <ul class="accordion__tab-list"> |
3004 | + <li class="accordion__tab-item" data-ng-repeat="subnet in tabs.nodes.metadata.subnets | orderBy:['name', '-count']" data-ng-class="{ 'is-active': isFilterActive('subnets', subnet.name, 'nodes') }"> |
3005 | + <a class="accordion__tab-link" href="" data-ng-click="toggleFilter('subnets', subnet.name, 'nodes')">{$ subnet.name $} ({$ subnet.count $})</a> |
3006 | + </li> |
3007 | + </ul> |
3008 | + </div> |
3009 | + </div> |
3010 | + <div class="ng-hide accordion__tab" data-ng-show="tabs.nodes.metadata.fabrics.length"> |
3011 | + <h4 class="accordion__tab-title maas-accordion-tab">Fabrics</h4> |
3012 | + <div class="accordion__tab-content"> |
3013 | + <ul class="accordion__tab-list"> |
3014 | + <li class="accordion__tab-item" data-ng-repeat="fabric in tabs.nodes.metadata.fabrics | orderBy:['name', '-count']" data-ng-class="{ 'is-active': isFilterActive('fabrics', fabric.name, 'nodes') }"> |
3015 | + <a class="accordion__tab-link" href="" data-ng-click="toggleFilter('fabrics', fabric.name, 'nodes')">{$ fabric.name $} ({$ fabric.count $})</a> |
3016 | + </li> |
3017 | + </ul> |
3018 | + </div> |
3019 | + </div> |
3020 | + <div class="ng-hide accordion__tab" data-ng-show="tabs.nodes.metadata.spaces.length"> |
3021 | + <h4 class="accordion__tab-title maas-accordion-tab">Spaces</h4> |
3022 | + <div class="accordion__tab-content"> |
3023 | + <ul class="accordion__tab-list"> |
3024 | + <li class="accordion__tab-item" data-ng-repeat="space in tabs.nodes.metadata.spaces | orderBy:['name', '-count']" data-ng-class="{ 'is-active': isFilterActive('spaces', space.name, 'nodes') }"> |
3025 | + <a class="accordion__tab-link" href="" data-ng-click="toggleFilter('spaces', space.name, 'nodes')">{$ space.name $} ({$ space.count $})</a> |
3026 | + </li> |
3027 | + </ul> |
3028 | + </div> |
3029 | + </div> |
3030 | + <div class="ng-hide accordion__tab" data-ng-show="tabs.nodes.metadata.zone.length"> |
3031 | + <h4 class="accordion__tab-title maas-accordion-tab">Zones</h4> |
3032 | + <div class="accordion__tab-content"> |
3033 | + <ul class="accordion__tab-list"> |
3034 | + <li class="accordion__tab-item" data-ng-repeat="zone in tabs.nodes.metadata.zone | orderBy:['name', '-count']" data-ng-class="{ 'is-active': isFilterActive('zone', zone.name, 'nodes') }"> |
3035 | + <a class="accordion__tab-link" href="" data-ng-click="toggleFilter('zone', zone.name, 'nodes')">{$ zone.name $} ({$ zone.count $})</a> |
3036 | + </li> |
3037 | + </ul> |
3038 | + </div> |
3039 | + </div> |
3040 | + </div> |
3041 | + <div class="accordion three-col maas-accordion ng-hide" data-ng-show="currentpage === 'devices'" |
3042 | + data-ng-class="{ 'is-disabled': tabs.devices.actionOption }"> |
3043 | + <h3 class="accordion__title">Filter by</h3> |
3044 | + <!-- XXX rvba 2015-02-25 - Need to add e2e test. --> |
3045 | + <div class="ng-hide accordion__tab" data-ng-show="tabs.devices.metadata.owner.length"> |
3046 | + <h4 class="accordion__tab-title maas-accordion-tab active">Owner</h4> |
3047 | + <div class="accordion__tab-content"> |
3048 | + <ul class="accordion__tab-list"> |
3049 | + <li class="accordion__tab-item" data-ng-repeat="owner in tabs.devices.metadata.owner | orderBy:['name', '-count']" data-ng-class="{ 'is-active': isFilterActive('owner', owner.name, 'devices') }"> |
3050 | + <a class="accordion__tab-link" href="" data-ng-click="toggleFilter('owner', owner.name, 'devices')">{$ owner.name $} ({$ owner.count $})</a> |
3051 | + </li> |
3052 | + </ul> |
3053 | + </div> |
3054 | + </div> |
3055 | + <div class="ng-hide accordion__tab" data-ng-show="tabs.devices.metadata.tags.length"> |
3056 | + <h4 class="accordion__tab-title maas-accordion-tab">Tags</h4> |
3057 | + <div class="accordion__tab-content"> |
3058 | + <ul class="accordion__tab-list"> |
3059 | + <li class="accordion__tab-item" data-ng-repeat="tag in tabs.devices.metadata.tags | orderBy:['name', '-count']" data-ng-class="{ 'is-active': isFilterActive('tags', tag.name, 'devices') }"> |
3060 | + <a class="accordion__tab-link" href="" data-ng-click="toggleFilter('tags', tag.name, 'devices')">{$ tag.name $} ({$ tag.count $})</a> |
3061 | + </li> |
3062 | + </ul> |
3063 | + </div> |
3064 | + </div> |
3065 | + <div class="ng-hide accordion__tab" data-ng-show="tabs.devices.metadata.zone.length"> |
3066 | + <h4 class="accordion__tab-title maas-accordion-tab">Zones</h4> |
3067 | + <div class="accordion__tab-content"> |
3068 | + <ul class="accordion__tab-list"> |
3069 | + <li class="accordion__tab-item" data-ng-repeat="zone in tabs.devices.metadata.zone | orderBy:['name', '-count']" data-ng-class="{ 'is-active': isFilterActive('zone', zone.name, 'devices') }"> |
3070 | + <a class="accordion__tab-link" href="" data-ng-click="toggleFilter('zone', zone.name, 'devices')">{$ zone.name $} ({$ zone.count $})</a> |
3071 | + </li> |
3072 | + </ul> |
3073 | + </div> |
3074 | + </div> |
3075 | + </div> |
3076 | + </aside> |
3077 | + <!-- XXX ricgard 2016-06-16 - Need to add e2e test. --> |
3078 | + <div class="nine-col last-col" data-ng-show="currentpage === 'nodes'"> |
3079 | + <form> |
3080 | + <div id="search-bar" class="search nine-col"> |
3081 | + <!-- XXX ricgard 2016-06-16 - Need to add e2e test. --> |
3082 | + <input |
3083 | + type="search" placeholder="Search nodes" class="search__input" |
3084 | + data-ng-model="tabs.nodes.search" data-ng-change="updateFilters('nodes')" |
3085 | + data-ng-class="{ error: !tabs.nodes.searchValid }" |
3086 | + data-ng-disabled="tabs.nodes.actionOption" /> |
3087 | + <input type="submit" class="search__submit" |
3088 | + data-ng-class="{ 'search__submit--close': tabs.nodes.search.length > 0 }" |
3089 | + data-ng-click="clearSearch('nodes')" /> |
3090 | + </div> |
3091 | + <table id="nodes-listing"> |
3092 | + <thead> |
3093 | + <tr> |
3094 | + <th class="table-col--3"> |
3095 | + <!-- XXX ricgard 2016-06-16 - Need to add e2e test. --> |
3096 | + <input class="checkbox" type="checkbox" data-ng-click="toggleCheckAll('nodes')" data-ng-checked="tabs.nodes.allViewableChecked" id="check-all" data-ng-disabled="hasActionsInProgress('nodes')" /> |
3097 | + <label class="checkbox-label" for="check-all"></label> |
3098 | + </th> |
3099 | + <th colspan="2" class="u-align--left"> |
3100 | + <!-- XXX ricgard 2016-06-16 - Need to add e2e test. --> |
3101 | + <a href="" |
3102 | + data-ng-click="selectColumnOrSort('fqdn', 'nodes')" |
3103 | + data-ng-class="{'is-active': tabs.nodes.column === 'fqdn', 'is-sorted': tabs.nodes.predicate === 'fqdn', 'sort-asc': tabs.nodes.reverse === false, 'sort-desc': tabs.nodes.reverse === true}"><span title="Fully Qualified Domain Name">FQDN</span></a> |
3104 | + <span class="divide"></span> |
3105 | + <a href="" |
3106 | + data-ng-click="selectColumnOrSort('pxe_mac', 'nodes')" |
3107 | + data-ng-class="{'is-active': tabs.nodes.column === 'pxe_mac', 'is-sorted': tabs.nodes.predicate === 'pxe_mac', 'sort-asc': tabs.nodes.reverse === false, 'sort-desc': tabs.nodes.reverse === true}"><span title="Media Access Control addresses">MAC</span></a> |
3108 | + </th> |
3109 | + <th class="u-align--center"> |
3110 | + <!-- XXX ricgard 2016-06-16 - Need to add e2e test. --> |
3111 | + <a href="" class="u-align--center" data-ng-click="sortTable('power_state', 'nodes')" data-ng-class="{'is-sorted': tabs.nodes.predicate === 'power_state', 'sort-asc': tabs.nodes.reverse === false, 'sort-desc': tabs.nodes.reverse === true}">Power</a> |
3112 | + </th> |
3113 | + <th class="table-col--3"></th> |
3114 | + <th> |
3115 | + <!-- XXX ricgard 2016-06-16 - Need to add e2e test. --> |
3116 | + <a href="" data-ng-click="sortTable('status', 'nodes')" data-ng-class="{'is-sorted': tabs.nodes.predicate === 'status', 'sort-asc': tabs.nodes.reverse === false, 'sort-desc': tabs.nodes.reverse === true}">Status</a> |
3117 | + </th> |
3118 | + <th class="table-col--10"> |
3119 | + <!-- XXX ricgard 2016-06-16 - Need to add e2e test. --> |
3120 | + <a href="" data-ng-click="sortTable('owner', 'nodes')" data-ng-class="{'is-sorted': tabs.nodes.predicate === 'owner', 'sort-asc': tabs.nodes.reverse === false, 'sort-desc': tabs.nodes.reverse === true}">Owner</a> |
3121 | + </th> |
3122 | + <th class="u-align--right"> |
3123 | + <!-- XXX ricgard 2016-06-16 - Need to add e2e test. --> |
3124 | + <a href="" data-ng-click="sortTable('cpu_count', 'nodes')" data-ng-class="{'is-sorted': tabs.nodes.predicate=== 'cpu_count', 'sort-asc': tabs.nodes.reverse === false, 'sort-desc': tabs.nodes.reverse === true}">Cores</a> |
3125 | + </th> |
3126 | + <th class="u-align--right"> |
3127 | + <!-- XXX ricgard 2016-06-16 - Need to add e2e test. --> |
3128 | + <a href="" data-ng-click="sortTable('memory', 'nodes')" data-ng-class="{'is-sorted': tabs.nodes.predicate === 'memory', 'sort-asc': tabs.nodes.reverse === false, 'sort-desc': tabs.nodes.reverse === true}">RAM (GiB)</a> |
3129 | + </th> |
3130 | + <th class="u-align--right"> |
3131 | + <!-- XXX ricgard 2016-06-16 - Need to add e2e test. --> |
3132 | + <a href="" data-ng-click="sortTable('disks', 'nodes')" data-ng-class="{'is-sorted': tabs.nodes.predicate === 'disks', 'sort-asc': tabs.nodes.reverse === false, 'sort-desc': tabs.nodes.reverse === true}">Disks</a> |
3133 | + </th> |
3134 | + <th class="u-align--right"> |
3135 | + <!-- XXX ricgard 2016-06-16 - Need to add e2e test. --> |
3136 | + <a href="" data-ng-click="sortTable('storage', 'nodes')" data-ng-class="{'is-sorted': tabs.nodes.predicate === 'storage', 'sort-asc': tabs.nodes.reverse === false, 'sort-desc': tabs.nodes.reverse === true}">Storage (GB)</a> |
3137 | + </th> |
3138 | + </tr> |
3139 | + </thead> |
3140 | + <tbody> |
3141 | + <!-- XXX blake_r 2015-02-18 - Need to add e2e test. This really needs lots of tests. --> |
3142 | + <tr |
3143 | + data-ng-repeat="node in tabs.nodes.filtered_items = (nodes | nodesFilter:tabs.nodes.search | orderBy:tabs.nodes.predicate:tabs.nodes.reverse) track by node.system_id" |
3144 | + data-ng-class="{ 'table--error': !supportsAction(node, 'nodes'), selected: node.$selected }"> |
3145 | + <td class="table-col--3"> |
3146 | + <!-- XXX ricgard 2016-06-16 - Need to add e2e test. --> |
3147 | + <input class="checkbox" type="checkbox" data-ng-click="toggleChecked(node, 'nodes')" data-ng-checked="node.$selected" id="{$ node.fqdn $}" data-ng-disabled="hasActionsInProgress('nodes')" /> |
3148 | + <label class="checkbox-label" for="{$ node.fqdn $}"></label> |
3149 | + </td> |
3150 | + <!-- XXX ricgard 2016-06-16 - Need to add e2e test. --> |
3151 | + <td class="u-align--left" data-ng-show="tabs.nodes.column === 'fqdn'" colspan="2"> |
3152 | + <a href="#/node/{$ node.system_id $}">{$ node.fqdn $}</a> |
3153 | + </td> |
3154 | + <!-- XXX ricgard 2016-06-16 - Need to add e2e test. --> |
3155 | + <td class="ng-hide u-align--left" data-ng-show="tabs.nodes.column === 'pxe_mac'" colspan="2"> |
3156 | + <a href="#/node/{$ node.system_id $}" title="{$ node.pxe_mac_vendor $}">{$ node.pxe_mac $}</a> |
3157 | + <a href="#/node/{$ node.system_id $}" class="extra-macs" data-ng-show="node.extra_macs.length">(+{$ node.extra_macs.length $})</a> |
3158 | + </td> |
3159 | + <td class="powerstate u-align--center"> |
3160 | + <span title="{$ node.power_state $}" class="icon icon--power-{$ node.power_state $}"></span> |
3161 | + </td> |
3162 | + <td class="table-col--3"><i data-ng-if="showSpinner(node)" class="icon icon--loading u-animation--spin"></i></td> |
3163 | + <td class="status u-text--truncate">{$ getStatusText(node) $}</td> |
3164 | + <td class="table-col--10">{$ node.owner $}</td> |
3165 | + <td class="u-align--right">{$ node.cpu_count $}</td> |
3166 | + <td class="u-align--right">{$ node.memory $}</td> |
3167 | + <td class="u-align--right">{$ node.physical_disk_count $}</td> |
3168 | + <td class="u-align--right">{$ node.storage $}</td> |
3169 | + </tr> |
3170 | + </tbody> |
3171 | + </table> |
3172 | + </form> |
3173 | + </div> |
3174 | + <div class="nine-col last-col" class="ng-hide" data-ng-show="currentpage === 'devices'"> |
3175 | + <div class="search nine-col"> |
3176 | + <!-- XXX rvba 2015-02-25 - Need to add e2e test. --> |
3177 | + <input |
3178 | + type="search" placeholder="Search devices" class="search__input" |
3179 | + data-ng-model="tabs.devices.search" data-ng-change="updateFilters('devices')" |
3180 | + data-ng-class="{ error: !tabs.devices.searchValid }" |
3181 | + data-ng-disabled="tabs.devices.actionOption" /> |
3182 | + <input type="submit" class="search__submit" |
3183 | + data-ng-class="{ 'search__submit--close': tabs.devices.search.length > 0 }" |
3184 | + data-ng-click="clearSearch('devices')" /> |
3185 | + </div> |
3186 | + <table> |
3187 | + <thead> |
3188 | + <tr> |
3189 | + <th class="table-col--3"> |
3190 | + <!-- XXX rvba 2015-02-25 - Need to add e2e test. --> |
3191 | + <input type="checkbox" class="checkbox" data-ng-click="toggleCheckAll('devices')" data-ng-checked="tabs.devices.allViewableChecked" id="check-all-devices" data-ng-disabled="hasActionsInProgress('devices')" /> |
3192 | + <label for="check-all-devices" class="checkbox-label"></label> |
3193 | + </th> |
3194 | + <th class="table-col--24"> |
3195 | + <!-- XXX rvba 2015-02-25 - Need to add e2e test. --> |
3196 | + <a href="" data-ng-click="sortTable('fqdn', 'devices')" data-ng-class="{'is-sorted': tabs.devices.predicate === 'fqdn', 'sort-asc': tabs.devices.reverse === false, 'sort-desc': tabs.devices.reverse === true}"> |
3197 | + <span title="Fully Qualified Domain Name">FQDN</span> |
3198 | + </a> |
3199 | + </th> |
3200 | + <th class="table-col--25"> |
3201 | + <a href="" data-ng-click="sortTable('primary_mac', 'devices')" data-ng-class="{'is-sorted': tabs.devices.predicate === 'primary_mac', 'sort-asc': tabs.devices.reverse === false, 'sort-desc': tabs.devices.reverse === true}"> |
3202 | + <span title="Media Access Control addresses">MAC</span> |
3203 | + </a> |
3204 | + </th> |
3205 | + <th class="table-col--15"> |
3206 | + <a href="" data-ng-click="sortTable('ip_assignment', 'devices')" data-ng-class="{'is-sorted': tabs.devices.predicate === 'ip_assignment', 'sort-asc': tabs.devices.reverse === false, 'sort-desc': tabs.devices.reverse === true}">IP Assignment</a> |
3207 | + </th> |
3208 | + <th class="table-col--20"> |
3209 | + <a href="" data-ng-click="sortTable('ip_address', 'devices')" data-ng-class="{'is-sorted': tabs.devices.predicate === 'ip_address', 'sort-asc': tabs.devices.reverse === false, 'sort-desc': tabs.devices.reverse === true}">IP Address</a> |
3210 | + </th> |
3211 | + <th class="table-col--12"> |
3212 | + <!-- XXX rvba 2015-02-25 - Need to add e2e test. --> |
3213 | + <a href="" data-ng-click="sortTable('owner', 'devices')" data-ng-class="{'is-sorted': tabs.devices.predicate === 'owner', 'sort-asc': tabs.devices.reverse === false, 'sort-desc': tabs.devices.reverse === true}">Owner</a> |
3214 | + </th> |
3215 | + </tr> |
3216 | + </thead> |
3217 | + <tbody> |
3218 | + <!-- XXX rvba 2015-02-25 - Need to add e2e test. This really needs lots of tests. --> |
3219 | + <tr |
3220 | + data-ng-repeat="device in tabs.devices.filtered_items = (devices | nodesFilter:tabs.devices.search | orderBy:tabs.devices.predicate:tabs.devices.reverse) track by device.system_id" |
3221 | + data-ng-class="{ 'table--error': !supportsAction(device, 'devices'), selected: device.$selected }"> |
3222 | + <td class="table-col--3"> |
3223 | + <input type="checkbox" class="checkbox" data-ng-click="toggleChecked(device, 'devices')" data-ng-checked="device.$selected" id="{$ device.fqdn $}" data-ng-disabled="hasActionsInProgress('devices')"/> |
3224 | + <label for="{$ device.fqdn $}" class="checkbox-label"></label> |
3225 | + </td> |
3226 | + <td class="table-col--24">{$ device.fqdn $}</td> |
3227 | + <td class="table-col--25"> |
3228 | + {$ device.primary_mac $} |
3229 | + <span class="extra-macs" data-ng-show="device.extra_macs.length">(+{$ device.extra_macs.length $})</span> |
3230 | + </td> |
3231 | + <td class="table-col--15">{$ getDeviceIPAssignment(device.ip_assignment) $}</td> |
3232 | + <td class="table-col--20">{$ device.ip_address $}</td> |
3233 | + <td class="table-col--12">{$ device.owner $}</td> |
3234 | + </tr> |
3235 | + </tbody> |
3236 | + </table> |
3237 | + </div> |
3238 | + <div class="twelve-col last-col" class="ng-hide" data-ng-show="currentpage === 'controllers'"> |
3239 | + <div class="search twelve-col"> |
3240 | + <!-- XXX rvba 2015-02-25 - Need to add e2e test. --> |
3241 | + <input |
3242 | + type="search" placeholder="Search controllers" class="search__input" |
3243 | + data-ng-model="tabs.controllers.search" data-ng-change="updateFilters('controllers')" |
3244 | + data-ng-class="{ error: !tabs.controllers.searchValid }" |
3245 | + data-ng-disabled="tabs.controllers.actionOption" /> |
3246 | + <input type="submit" class="search__submit" |
3247 | + data-ng-class="{ 'search__submit--close': tabs.controllers.search.length > 0 }" |
3248 | + data-ng-click="clearSearch('controllers')" /> |
3249 | + </div> |
3250 | + <table> |
3251 | + <thead> |
3252 | + <tr> |
3253 | + <th class="table-col--2"> |
3254 | + <!-- XXX rvba 2015-02-25 - Need to add e2e test. --> |
3255 | + <input type="checkbox" class="checkbox" data-ng-click="toggleCheckAll('controllers')" data-ng-checked="tabs.controllers.allViewableChecked" id="check-all-controllers" data-ng-disabled="hasActionsInProgress('controllers')" /> |
3256 | + <label for="check-all-controllers" class="checkbox-label"></label> |
3257 | + </th> |
3258 | + <th class="table-col--19"> |
3259 | + <a href="" data-ng-click="sortTable('fqdn', 'controllers')" data-ng-class="{'is-sorted': tabs.controllers.predicate === 'fqdn', 'sort-asc': tabs.controllers.reverse === false, 'sort-desc': tabs.controllers.reverse === true}"> |
3260 | + <span title="Fully Qualified Domain Name">Name</span> |
3261 | + </a> |
3262 | + </th> |
3263 | + <th class="table-col--4 u-align--center"> |
3264 | + <span title="Status">Status</span> |
3265 | + </th> |
3266 | + <th class="table-col--25"> |
3267 | + <a href="" data-ng-click="sortTable('node_type_display', 'controllers')" data-ng-class="{'is-sorted': tabs.controllers.predicate === 'node_type_display', 'sort-asc': tabs.controllers.reverse === false, 'sort-desc': tabs.controllers.reverse === true}"> |
3268 | + <span title="Controller Type">Type</span> |
3269 | + </a> |
3270 | + </th> |
3271 | + <th class="table-col--15"> |
3272 | + <a href="" data-ng-click="sortTable('updated', 'controllers')" data-ng-class="{'is-sorted': tabs.controllers.predicate === 'updated', 'sort-asc': tabs.controllers.reverse === false, 'sort-desc': tabs.controllers.reverse === true}">Last Image Sync</a> |
3273 | + </th> |
3274 | + <th class="table-col--15"> |
3275 | + <a href="" data-ng-click="sortTable('updated', 'controllers')" data-ng-class="{'is-sorted': tabs.controllers.predicate === 'updated', 'sort-asc': tabs.controllers.reverse === false, 'sort-desc': tabs.controllers.reverse === true}">Images Status</a> |
3276 | + </th> |
3277 | + </tr> |
3278 | + </thead> |
3279 | + <tbody> |
3280 | + <!-- XXX rvba 2015-02-25 - Need to add e2e test. This really needs lots of tests. --> |
3281 | + <tr |
3282 | + data-ng-repeat="controller in tabs.controllers.filtered_items = (controllers | nodesFilter:tabs.controllers.search | orderBy:tabs.controllers.predicate:tabs.controllers.reverse) track by controller.system_id" |
3283 | + data-ng-class="{ 'table--error': !supportsAction(controller, 'controllers'), selected: controller.$selected }"> |
3284 | + <td class="table-col--2"> |
3285 | + <input type="checkbox" class="checkbox" data-ng-click="toggleChecked(controller, 'controllers')" data-ng-checked="controller.$selected" id="{$ controller.fqdn $}" data-ng-disabled="hasActionsInProgress('controllers')"/> |
3286 | + <label for="{$ controller.fqdn $}" class="checkbox-label"></label> |
3287 | + </td> |
3288 | + <td class="table-col--19"> |
3289 | + <a href="#/node/controller/{$ controller.system_id $}">{$ controller.fqdn $}</a> |
3290 | + </td> |
3291 | + <td class="table-col--4 u-align--center" data-maas-controller-status="controller" data-maas-services="services"></td> |
3292 | + <td class="table-col--25">{$ controller.node_type_display $}</td> |
3293 | + <td class="table-col--15">{$ controller.last_image_sync || 'Never' $}</td> |
3294 | + <td class="table-col--15"> |
3295 | + <maas-controller-image-status system-id="controller.system_id"></maas-controller-image-status> |
3296 | + </td> |
3297 | + </tr> |
3298 | + </tbody> |
3299 | + </table> |
3300 | + </div> |
3301 | +</div> |
3302 | +</div> |
3303 | +>>>>>>> MERGE-SOURCE |
3304 | |
3305 | === modified file 'src/maasserver/static/partials/settings.html' |
3306 | --- src/maasserver/static/partials/settings.html 2017-04-18 14:59:13 +0000 |
3307 | +++ src/maasserver/static/partials/settings.html 2017-04-25 09:34:40 +0000 |
3308 | @@ -1,3 +1,4 @@ |
3309 | +<<<<<<< TREE |
3310 | <div class="wrapper--sticky" sticky media-query="min-width: 769px"> |
3311 | <header class="page-header u-margin--bottom-none"> |
3312 | <div class="wrapper--inner"> |
3313 | @@ -8,6 +9,9 @@ |
3314 | </div> |
3315 | </header> |
3316 | <div class="page-navigation"> |
3317 | +======= |
3318 | +<header class="page-header u-margin--bottom" sticky> |
3319 | +>>>>>>> MERGE-SOURCE |
3320 | <div class="wrapper--inner"> |
3321 | <nav class="page-navigation__links"> |
3322 | <a role="tab" class="page-navigation__link" href="settings/">General</a> |
3323 | |
3324 | === modified file 'src/maasserver/static/partials/space-details.html' |
3325 | --- src/maasserver/static/partials/space-details.html 2017-03-27 13:09:56 +0000 |
3326 | +++ src/maasserver/static/partials/space-details.html 2017-04-25 09:34:40 +0000 |
3327 | @@ -1,12 +1,20 @@ |
3328 | <div data-ng-hide="loaded"> |
3329 | +<<<<<<< TREE |
3330 | <header class="page-header" sticky media-query="min-width: 769px"> |
3331 | +======= |
3332 | + <header class="page-header" sticky> |
3333 | +>>>>>>> MERGE-SOURCE |
3334 | <div class="wrapper--inner"> |
3335 | <h1 class="page-header__title">Loading...</h1> |
3336 | </div> |
3337 | </header> |
3338 | </div> |
3339 | <div class="ng-hide" data-ng-show="loaded"> |
3340 | +<<<<<<< TREE |
3341 | <header class="page-header" sticky media-query="min-width: 769px"> |
3342 | +======= |
3343 | + <header class="page-header" sticky> |
3344 | +>>>>>>> MERGE-SOURCE |
3345 | <div class="wrapper--inner"> |
3346 | <h1 class="page-header__title">{$ space.name $}</h1> |
3347 | <div class="page-header__controls ng-hide" data-ng-show="isSuperUser() && !isDefaultSpace() && !loading"> |
3348 | |
3349 | === modified file 'src/maasserver/static/partials/ssh-keys.html' |
3350 | --- src/maasserver/static/partials/ssh-keys.html 2017-03-28 14:56:11 +0000 |
3351 | +++ src/maasserver/static/partials/ssh-keys.html 2017-04-25 09:34:40 +0000 |
3352 | @@ -12,6 +12,7 @@ |
3353 | data-ng-class="{ 'is-active': group.id === openRow }"> |
3354 | <div class="table__data table-col--25" aria-label="Source">{$ sourceTitles[group.source] $}</div> |
3355 | <div data-ng-if="group.source !== 'upload'"> |
3356 | +<<<<<<< TREE |
3357 | <div class="table__data table-col--35" aria-label="ID">{$ group.authId $}</div> |
3358 | <div class="table__data table-col--30" aria-label="Number of keys">{$ group.keys.length $} |
3359 | <button class="icon icon--open tooltip u-margin--top-tiny u-padding--left-large" aria-label="Open" |
3360 | @@ -21,13 +22,29 @@ |
3361 | data-ng-click="close()" |
3362 | data-ng-if="group.source !== 'upload' && openRow === group.id">Close</button> |
3363 | </div> |
3364 | +======= |
3365 | + <div class="table__data table-col--35">{$ group.authId $}</div> |
3366 | + <div class="table__data table-col--30">{$ group.keys.length $} |
3367 | + <a class="icon icon--open tooltip u-margin--top-tiny u-padding--left-large" aria-label="Open" |
3368 | + data-ng-click="open(group, 'view')" |
3369 | + data-ng-if="group.source !== 'upload' && openRow !== group.id">Open</a> |
3370 | + <a class="icon icon--close tooltip u-margin--top-tiny u-padding--left-large" aria-label="Close" |
3371 | + data-ng-click="close()" |
3372 | + data-ng-if="group.source !== 'upload' && openRow === group.id">Close</a></div> |
3373 | +>>>>>>> MERGE-SOURCE |
3374 | </div> |
3375 | <div data-ng-if="group.source === 'upload'"> |
3376 | <div class="table__data table-col--65" data-ng-bind-html="trustAsHtml(group.keys[0].display)"></div> |
3377 | </div> |
3378 | +<<<<<<< TREE |
3379 | <div class="table__data table-col--10 u-align--right"> |
3380 | <button class="icon icon--delete tooltip" aria-label="Delete" |
3381 | data-ng-click="open(group, 'delete')">Delete</button> |
3382 | +======= |
3383 | + <div class="table__data table-col--10 u-align--right"> |
3384 | + <a class="icon icon--delete tooltip" aria-label="Delete" |
3385 | + data-ng-click="open(group, 'delete')">Delete</a> |
3386 | +>>>>>>> MERGE-SOURCE |
3387 | </div> |
3388 | <div class="table__dropdown"> |
3389 | <div class="table__row u-border--none" |
3390 | |
3391 | === modified file 'src/maasserver/static/partials/subnet-details.html' |
3392 | --- src/maasserver/static/partials/subnet-details.html 2017-04-18 14:59:13 +0000 |
3393 | +++ src/maasserver/static/partials/subnet-details.html 2017-04-25 09:34:40 +0000 |
3394 | @@ -1,12 +1,21 @@ |
3395 | <div data-ng-hide="loaded"> |
3396 | +<<<<<<< TREE |
3397 | <header class="page-header" sticky media-query="min-width: 769px"> |
3398 | +======= |
3399 | + <header class="page-header" sticky> |
3400 | +>>>>>>> MERGE-SOURCE |
3401 | <div class="wrapper--inner"> |
3402 | <h1 class="page-header__title">Loading...</h1> |
3403 | </div> |
3404 | </header> |
3405 | </div> |
3406 | +<<<<<<< TREE |
3407 | <div class="ng-hide" data-ng-show="loaded" window-width> |
3408 | <header class="page-header" sticky media-query="min-width: 769px"> |
3409 | +======= |
3410 | +<div class="ng-hide" data-ng-show="loaded"> |
3411 | + <header class="page-header" sticky> |
3412 | +>>>>>>> MERGE-SOURCE |
3413 | <div class="wrapper--inner"> |
3414 | <h1 class="page-header__title">{$ subnet.cidr $}</h1> |
3415 | <!-- "Take action" dropdown --> |
3416 | @@ -39,8 +48,13 @@ |
3417 | <section class="page-header__section twelve-col u-margin--bottom-none ng-hide" data-ng-show="actionError"> |
3418 | <p class="page-header__message page-header__message--error">{$ actionError $}</p> |
3419 | <div class="page-header__controls"> |
3420 | +<<<<<<< TREE |
3421 | <button class="button--base button--inline" data-ng-click="cancelAction()">Cancel</button> |
3422 | <button class="button--secondary button--inline" data-ng-click="actionRetry()">Retry</button> |
3423 | +======= |
3424 | + <a href="" class="button--base button--inline" data-ng-click="cancelAction()">Cancel</a> |
3425 | + <button class="button--primary button--inline" data-ng-click="actionRetry()">Retry</button> |
3426 | +>>>>>>> MERGE-SOURCE |
3427 | </div> |
3428 | </section> |
3429 | </div> |
3430 | |
3431 | === modified file 'src/maasserver/static/partials/vlan-details.html' |
3432 | --- src/maasserver/static/partials/vlan-details.html 2017-03-27 13:09:56 +0000 |
3433 | +++ src/maasserver/static/partials/vlan-details.html 2017-04-25 09:34:40 +0000 |
3434 | @@ -1,12 +1,22 @@ |
3435 | +<<<<<<< TREE |
3436 | <div data-ng-if="!vlanDetails.loaded"> |
3437 | <header class="page-header" sticky media-query="min-width: 769px"> |
3438 | +======= |
3439 | +<div data-ng-hide="vlanDetails.loaded"> |
3440 | + <header class="page-header" sticky> |
3441 | +>>>>>>> MERGE-SOURCE |
3442 | <div class="wrapper--inner"> |
3443 | <h1 class="page-header__title">Loading...</h1> |
3444 | </div> |
3445 | </header> |
3446 | </div> |
3447 | +<<<<<<< TREE |
3448 | <div data-ng-if="vlanDetails.loaded"> |
3449 | <header class="page-header" sticky media-query="min-width: 769px"> |
3450 | +======= |
3451 | +<div class="ng-hide" data-ng-show="vlanDetails.loaded"> |
3452 | + <header class="page-header" sticky> |
3453 | +>>>>>>> MERGE-SOURCE |
3454 | <div class="wrapper--inner"> |
3455 | <h1 class="page-header__title">{$ vlanDetails.title $}</h1> |
3456 | <!-- "Take action" dropdown --> |
3457 | |
3458 | === added file 'src/maasserver/static/scss/_base.forms.scss.OTHER' |
3459 | --- src/maasserver/static/scss/_base.forms.scss.OTHER 1970-01-01 00:00:00 +0000 |
3460 | +++ src/maasserver/static/scss/_base.forms.scss.OTHER 2017-04-25 09:34:40 +0000 |
3461 | @@ -0,0 +1,377 @@ |
3462 | +//// |
3463 | +/// @author Web Team at Canonical Ltd |
3464 | +/// @link http://ubuntudesign.github.io/vanilla-framework/docs/#mixin-maas-forms |
3465 | +/// @since 0.0.3 |
3466 | +//// |
3467 | + |
3468 | +/// Form element styles |
3469 | +/// @group Forms |
3470 | +@mixin maas-forms { |
3471 | + |
3472 | + // All input elements |
3473 | + input { |
3474 | + |
3475 | + &[type='text'], |
3476 | + &[type='number'], |
3477 | + &[type='search'], |
3478 | + &[type='password'], |
3479 | + &[type='email'], |
3480 | + &[type='url'], |
3481 | + &[type='tel'] { |
3482 | + @extend %input-elements; |
3483 | + padding: 7px 10px; |
3484 | + box-shadow: none; |
3485 | + width: 100%; |
3486 | + |
3487 | + &::placeholder { |
3488 | + color: $warm-grey; |
3489 | + } |
3490 | + |
3491 | + &[disabled] { |
3492 | + color: $warm-grey; |
3493 | + background-color: $transparent; |
3494 | + } |
3495 | + } |
3496 | + |
3497 | + &[type='number'] { |
3498 | + padding-right: 15px; |
3499 | + } |
3500 | + |
3501 | + &[type='search'] { |
3502 | + appearance: textfield; |
3503 | + } |
3504 | + |
3505 | + &[type='search']::-webkit-search-decoration, |
3506 | + &[type='search']::-webkit-search-cancel-button { |
3507 | + appearance: none; |
3508 | + } |
3509 | + |
3510 | + &[type='checkbox'] { |
3511 | + margin: 4px 0 0; |
3512 | + margin-top: 1px 9; |
3513 | + line-height: normal; |
3514 | + } |
3515 | + |
3516 | + &[type='radio'], |
3517 | + &[type='image'] { |
3518 | + display: inline-block; |
3519 | + margin-right: 10px; |
3520 | + } |
3521 | + } |
3522 | + |
3523 | + // Text area styles |
3524 | + textarea { |
3525 | + height: auto; |
3526 | + min-height: 175px; |
3527 | + padding: 7px 10px !important; |
3528 | + box-shadow: none; |
3529 | + width: 100%; |
3530 | + line-height: 20px; |
3531 | + |
3532 | + &::placeholder { |
3533 | + color: $warm-grey; |
3534 | + } |
3535 | + |
3536 | + &[disabled] { |
3537 | + color: $warm-grey; |
3538 | + background-color: $transparent; |
3539 | + } |
3540 | + } |
3541 | + |
3542 | + // Select dropdown styles |
3543 | + select { |
3544 | + @extend %input-elements; |
3545 | + display: block; |
3546 | + clear: both; |
3547 | + cursor: pointer; |
3548 | + margin: 0; |
3549 | + background-image: url('#{$asset-path}images/forms/chevron-down.svg'); |
3550 | + background-repeat: no-repeat; |
3551 | + background-position: top 14px right 10px; |
3552 | + background-color: $white; |
3553 | + padding: 7px 30px 7px 10px !important; |
3554 | + box-shadow: none; |
3555 | + width: 100%; |
3556 | + |
3557 | + // Removes firefox select styles & arrow |
3558 | + -moz-appearance: none; |
3559 | + appearance: none; |
3560 | + text-indent: .01px; |
3561 | + text-overflow: ''; |
3562 | + |
3563 | + &[multiple], |
3564 | + &[size] { |
3565 | + height: auto; |
3566 | + background-image: none; |
3567 | + padding-top: 10px; |
3568 | + } |
3569 | + |
3570 | + &[disabled] { |
3571 | + color: $warm-grey; |
3572 | + background-image: none; |
3573 | + background-color: $transparent; |
3574 | + } |
3575 | + |
3576 | + // Removes firefox dotted outline focusing |
3577 | + &:-moz-focusring { |
3578 | + color: transparent; |
3579 | + text-shadow: 0 0 0 $black; |
3580 | + } |
3581 | + |
3582 | + &::-ms-expand { |
3583 | + display: none; |
3584 | + } |
3585 | + } |
3586 | + |
3587 | + fieldset { |
3588 | + background: none; |
3589 | + margin-left: 0; |
3590 | + padding: 0; |
3591 | + } |
3592 | + |
3593 | + label { |
3594 | + display: inline-block; |
3595 | + max-width: 100%; |
3596 | + margin-bottom: 5px; |
3597 | + } |
3598 | + |
3599 | + /// Base for label styling |
3600 | + [type="checkbox"] { |
3601 | + |
3602 | + &:not(:checked), |
3603 | + &:checked { |
3604 | + position: absolute; |
3605 | + left: -9999px; |
3606 | + } |
3607 | + |
3608 | + + label { |
3609 | + height: 16px; |
3610 | + position: relative; |
3611 | + padding-left: 25px; |
3612 | + cursor: pointer; |
3613 | + |
3614 | + &:before { |
3615 | + content: ''; |
3616 | + position: absolute; |
3617 | + left: 0; |
3618 | + top: 3px; |
3619 | + width: 11px; |
3620 | + height: 11px; |
3621 | + border: 1px solid $mid-grey; |
3622 | + background: $white; |
3623 | + border-radius: 2px; |
3624 | + } |
3625 | + } |
3626 | + |
3627 | + &:checked { |
3628 | + |
3629 | + + label:before { |
3630 | + background-color: $input-checked; |
3631 | + border-color: $input-checked; |
3632 | + } |
3633 | + |
3634 | + + label:after { |
3635 | + content: 'âś”'; |
3636 | + position: absolute; |
3637 | + line-height: 13px; |
3638 | + top: 3px; |
3639 | + left: 3px; |
3640 | + font-size: 10px; |
3641 | + color: $white; |
3642 | + transition: all .2s; |
3643 | + |
3644 | + @-moz-document url-prefix() { |
3645 | + font-size: 13px; |
3646 | + left: 1px; |
3647 | + } |
3648 | + } |
3649 | + } |
3650 | + |
3651 | + &[disabled] { |
3652 | + cursor: not-allowed; |
3653 | + |
3654 | + + label { |
3655 | + cursor: not-allowed; |
3656 | + |
3657 | + &:before { |
3658 | + opacity: .5; |
3659 | + } |
3660 | + } |
3661 | + } |
3662 | + } |
3663 | + |
3664 | + [type="radio"] { |
3665 | + |
3666 | + &:not(:checked), |
3667 | + &:checked { |
3668 | + position: absolute; |
3669 | + left: -9999px; |
3670 | + } |
3671 | + |
3672 | + + label { |
3673 | + position: relative; |
3674 | + padding-left: 25px; |
3675 | + cursor: pointer; |
3676 | + |
3677 | + &:before { |
3678 | + content: ''; |
3679 | + position: absolute; |
3680 | + left: 0; |
3681 | + top: 1px; |
3682 | + width: 13px; |
3683 | + height: 13px; |
3684 | + border: 1px solid $mid-grey; |
3685 | + background: $white; |
3686 | + border-radius: 50%; |
3687 | + } |
3688 | + } |
3689 | + |
3690 | + &:checked { |
3691 | + |
3692 | + + label:after { |
3693 | + content: ''; |
3694 | + position: absolute; |
3695 | + left: 3px; |
3696 | + top: 4px; |
3697 | + width: 9px; |
3698 | + height: 9px; |
3699 | + background: $input-checked; |
3700 | + border-radius: 50%; |
3701 | + } |
3702 | + } |
3703 | + } |
3704 | + |
3705 | + .tags { |
3706 | + width: 100%; |
3707 | + |
3708 | + .tag-list { |
3709 | + width: 100%; |
3710 | + margin: 0; |
3711 | + |
3712 | + .tag-item { |
3713 | + display: inline-block; |
3714 | + float: left; |
3715 | + line-height: 36px; |
3716 | + margin-bottom: 0; |
3717 | + margin-right: 10px; |
3718 | + word-wrap: break-word; |
3719 | + |
3720 | + .remove-button { |
3721 | + border-bottom: 0; |
3722 | + } |
3723 | + } |
3724 | + } |
3725 | + |
3726 | + .input { |
3727 | + width: 100% !important; |
3728 | + } |
3729 | + } |
3730 | + |
3731 | + .onoffswitch { |
3732 | + position: relative; |
3733 | + display: inline-block; |
3734 | + vertical-align: middle; |
3735 | + width: 38px; |
3736 | + margin: 0 0 4px; |
3737 | + //scss-lint:disable VendorPrefixes |
3738 | + -webkit-user-select: none; |
3739 | + -moz-user-select: none; |
3740 | + -ms-user-select: none; |
3741 | + //scss-lint:enable VendorPrefixes |
3742 | + |
3743 | + &[disabled] { |
3744 | + |
3745 | + .onoffswitch-checkbox, |
3746 | + .onoffswitch-label { |
3747 | + opacity: .5; |
3748 | + pointer-events: none; |
3749 | + } |
3750 | + } |
3751 | + } |
3752 | + |
3753 | + .onoffswitch-external-label { |
3754 | + display: inline-block; |
3755 | + margin-left: 5px; |
3756 | + } |
3757 | + |
3758 | + .onoffswitch-checkbox { |
3759 | + display: none !important; |
3760 | + } |
3761 | + |
3762 | + .onoffswitch-label { |
3763 | + display: block !important; |
3764 | + overflow: hidden; |
3765 | + cursor: pointer; |
3766 | + border-radius: 2px; |
3767 | + padding-left: 0 !important; |
3768 | + margin: 0 !important; |
3769 | + |
3770 | + &:before, |
3771 | + &:after { |
3772 | + display: none; |
3773 | + } |
3774 | + } |
3775 | + |
3776 | + .onoffswitch-inner { |
3777 | + display: block; |
3778 | + width: 200%; |
3779 | + margin-left: -100%; |
3780 | + transition: margin .3s ease-in 0s; |
3781 | + |
3782 | + &:before, |
3783 | + &:after { |
3784 | + display: block; |
3785 | + float: left; |
3786 | + width: 50%; |
3787 | + height: 18px; |
3788 | + padding: 0; |
3789 | + line-height: 18px; |
3790 | + font-size: 14px; |
3791 | + color: $white; |
3792 | + font-family: Trebuchet, Arial, sans-serif; |
3793 | + font-weight: bold; |
3794 | + box-sizing: border-box; |
3795 | + } |
3796 | + |
3797 | + &:before { |
3798 | + content: ''; |
3799 | + padding-left: 10px; |
3800 | + background-color: $success; |
3801 | + color: $white; |
3802 | + } |
3803 | + |
3804 | + &:after { |
3805 | + content: ''; |
3806 | + padding-right: 10px; |
3807 | + background-color: $gallery-grey; |
3808 | + color: $warm-grey; |
3809 | + text-align: right; |
3810 | + } |
3811 | + } |
3812 | + |
3813 | + .onoffswitch-switch { |
3814 | + display: block; |
3815 | + width: 19px; |
3816 | + height: 16px; |
3817 | + margin: 0; |
3818 | + background: $white; |
3819 | + position: absolute; |
3820 | + top: 0; |
3821 | + bottom: 0; |
3822 | + right: 19px; |
3823 | + border: 1px solid $outline; |
3824 | + border-radius: 2px; |
3825 | + transition: all .3s ease-in 0s; |
3826 | + box-sizing: border-box; |
3827 | + } |
3828 | + |
3829 | + .onoffswitch-checkbox:checked + .onoffswitch-label { |
3830 | + .onoffswitch-inner { |
3831 | + margin-left: 0; |
3832 | + } |
3833 | + |
3834 | + .onoffswitch-switch { |
3835 | + right: 0; |
3836 | + } |
3837 | + } |
3838 | +} |
3839 | |
3840 | === added file 'src/maasserver/static/scss/_components.buttons.scss.OTHER' |
3841 | --- src/maasserver/static/scss/_components.buttons.scss.OTHER 1970-01-01 00:00:00 +0000 |
3842 | +++ src/maasserver/static/scss/_components.buttons.scss.OTHER 2017-04-25 09:34:40 +0000 |
3843 | @@ -0,0 +1,149 @@ |
3844 | +//// |
3845 | +/// @author Web Team at Canonical Ltd |
3846 | +/// @link http://ubuntudesign.github.io/maas-gui-vanilla-theme/docs/#mixin-maas-buttons |
3847 | +/// @since 0.0.1 |
3848 | +//// |
3849 | + |
3850 | +/// Buttons element styles |
3851 | +/// @group Forms |
3852 | +@mixin maas-buttons { |
3853 | + // .button--primary { |
3854 | + // line-height: 20px; |
3855 | + // } |
3856 | + |
3857 | + .button--primary, |
3858 | + .button--secondary { |
3859 | + @extend %button-pattern; |
3860 | + } |
3861 | + |
3862 | + .button--secondary { |
3863 | + line-height: 18px; |
3864 | + } |
3865 | + |
3866 | + .button--primary, |
3867 | + .button--destructive, |
3868 | + .button--positive { |
3869 | + |
3870 | + &:hover { |
3871 | + color: $white; |
3872 | + } |
3873 | + } |
3874 | + |
3875 | + .button--base, |
3876 | + .button--neutral { |
3877 | + |
3878 | + &:hover { |
3879 | + color: $cool-grey; |
3880 | + } |
3881 | + } |
3882 | + |
3883 | + .button--large { |
3884 | + height: auto; |
3885 | + padding-top: 15px; |
3886 | + padding-bottom: 15px; |
3887 | + } |
3888 | +} |
3889 | + |
3890 | +@mixin maas-button-group { |
3891 | + .button-group { |
3892 | + position: relative; |
3893 | + width: 100%; |
3894 | + vertical-align: middle; |
3895 | + clear: both; |
3896 | + min-width: 160px; |
3897 | + |
3898 | + &.button-group--inline { |
3899 | + display: inline-block; |
3900 | + width: auto; |
3901 | + } |
3902 | + |
3903 | + .button-group__link { |
3904 | + display: inline-block; |
3905 | + float: left; |
3906 | + text-align: left; |
3907 | + padding-right: 35px; |
3908 | + |
3909 | + &::after { |
3910 | + content: ''; |
3911 | + display: inline-block; |
3912 | + position: absolute; |
3913 | + top: 15px; |
3914 | + right: 15px; |
3915 | + width: 4px; |
3916 | + height: 4px; |
3917 | + vertical-align: middle; |
3918 | + border-right: 1px solid; |
3919 | + border-bottom: 1px solid; |
3920 | + transform: rotate(45deg); |
3921 | + } |
3922 | + } |
3923 | + |
3924 | + .button-group__dropdown { |
3925 | + border-radius: 3px; |
3926 | + left: 0; |
3927 | + margin: 0; |
3928 | + list-style: none; |
3929 | + background: $white; |
3930 | + box-shadow: 0 1px 1px rgba(0, 0, 0, .1); |
3931 | + z-index: 20; |
3932 | + max-height: 1000px; |
3933 | + transition: max-height .3s ease-in; |
3934 | + position: absolute; |
3935 | + top: 36px; |
3936 | + clear: both; |
3937 | + min-width: 160px; |
3938 | + } |
3939 | + |
3940 | + .button-group__item { |
3941 | + float: left; |
3942 | + clear: both; |
3943 | + padding: 5px 10px; |
3944 | + margin: 0; |
3945 | + width: 100%; |
3946 | + |
3947 | + .button-group__item-link { |
3948 | + color: $cool-grey; |
3949 | + cursor: pointer; |
3950 | + width: 100%; |
3951 | + float: left; |
3952 | + margin: 0; |
3953 | + border: 0; |
3954 | + text-transform: lowercase; |
3955 | + white-space: nowrap; |
3956 | + |
3957 | + &:first-letter { |
3958 | + text-transform: uppercase; |
3959 | + } |
3960 | + |
3961 | + &:hover { |
3962 | + color: $link-hover; |
3963 | + text-decoration: none; |
3964 | + } |
3965 | + } |
3966 | + } |
3967 | + } |
3968 | + // scss-lint:enable SelectorFormat |
3969 | +} |
3970 | + |
3971 | +%button-pattern { |
3972 | + line-height: 20px; |
3973 | + white-space: nowrap; |
3974 | + vertical-align: middle; |
3975 | + touch-action: manipulation; |
3976 | + cursor: pointer; |
3977 | + user-select: none; |
3978 | + padding: 8px 14px; |
3979 | + height: 36px; |
3980 | + box-sizing: border-box; |
3981 | + |
3982 | + &[disabled], |
3983 | + &.button--disabled { |
3984 | + pointer-events: none; |
3985 | + opacity: .5; |
3986 | + } |
3987 | + |
3988 | + &.button--inline { |
3989 | + display: inline-block; |
3990 | + width: auto; |
3991 | + } |
3992 | +} |
3993 | |
3994 | === added file 'src/maasserver/static/scss/_components.flashmessages.scss.OTHER' |
3995 | --- src/maasserver/static/scss/_components.flashmessages.scss.OTHER 1970-01-01 00:00:00 +0000 |
3996 | +++ src/maasserver/static/scss/_components.flashmessages.scss.OTHER 2017-04-25 09:34:40 +0000 |
3997 | @@ -0,0 +1,59 @@ |
3998 | +//// |
3999 | +/// @author Web Team at Canonical Ltd |
4000 | +/// @link http://ubuntudesign.github.io/maas-gui-vanilla-theme/docs/#mixin-tool-tips |
4001 | +/// @since 0.0.1 |
4002 | +//// |
4003 | + |
4004 | +/// Flash message styles |
4005 | +/// @group maas flash messages |
4006 | +@mixin maas-flash-messages { |
4007 | + .flash-messages { |
4008 | + width: 100%; |
4009 | + float: left; |
4010 | + margin: 0; |
4011 | + |
4012 | + .flash-messages__item { |
4013 | + box-sizing: border-box; |
4014 | + border-radius: 2px; |
4015 | + list-style: none; |
4016 | + padding: 15px 20px; |
4017 | + margin: 0 0 20px; |
4018 | + background: $white; |
4019 | + background-position: top 50% left 15px; |
4020 | + background-repeat: no-repeat; |
4021 | + box-shadow: 0 1px 1px rgba(0, 0, 0, .1); |
4022 | + |
4023 | + &:last-of-type { |
4024 | + margin-bottom: 0; |
4025 | + } |
4026 | + |
4027 | + &.flash-messages__item--error { |
4028 | + background: $white url('#{$asset-path}images/icons/error.svg') no-repeat; |
4029 | + background-size: 16px 16px; |
4030 | + background-position: 15px center; |
4031 | + padding-left: 45px; |
4032 | + } |
4033 | + |
4034 | + &.flash-messages__item--info { |
4035 | + background: $white url('#{$asset-path}images/icons/info.svg') no-repeat; |
4036 | + background-size: 16px 16px; |
4037 | + background-position: 15px center; |
4038 | + padding-left: 45px; |
4039 | + } |
4040 | + |
4041 | + &.flash-messages__item--warning { |
4042 | + background: $white url('#{$asset-path}images/icons/warning.svg') no-repeat; |
4043 | + background-size: 16px 16px; |
4044 | + background-position: 15px center; |
4045 | + padding-left: 45px; |
4046 | + } |
4047 | + |
4048 | + &.flash-messages__item--success { |
4049 | + background: $white url('#{$asset-path}images/icons/success.svg') no-repeat; |
4050 | + background-size: 16px 16px; |
4051 | + background-position: 15px center; |
4052 | + padding-left: 45px; |
4053 | + } |
4054 | + } |
4055 | + } |
4056 | +} |
4057 | |
4058 | === added file 'src/maasserver/static/scss/_components.forms.scss.OTHER' |
4059 | --- src/maasserver/static/scss/_components.forms.scss.OTHER 1970-01-01 00:00:00 +0000 |
4060 | +++ src/maasserver/static/scss/_components.forms.scss.OTHER 2017-04-25 09:34:40 +0000 |
4061 | @@ -0,0 +1,201 @@ |
4062 | +//// |
4063 | +/// @author Web Team at Canonical Ltd |
4064 | +/// @link http://ubuntudesign.github.io/vanilla-framework/docs/#mixin-vf-forms |
4065 | +/// @since 0.0.3 |
4066 | +//// |
4067 | + |
4068 | +/// Form layout element styles |
4069 | +/// @group Forms |
4070 | +@mixin maas-form-layouts { |
4071 | + .form { |
4072 | + |
4073 | + .form__group { |
4074 | + margin-bottom: 10px; |
4075 | + |
4076 | + .form__group-input { |
4077 | + position: relative; |
4078 | + |
4079 | + .form__group-remove { |
4080 | + position: absolute; |
4081 | + top: 10px; |
4082 | + right: 10px; |
4083 | + cursor: pointer; |
4084 | + height: 16px; |
4085 | + width: 16px; |
4086 | + background: url('#{$asset-path}images/icons/remove.svg') no-repeat; |
4087 | + background-size: 75% 75%; |
4088 | + background-position: center; |
4089 | + display: inline-block; |
4090 | + } |
4091 | + |
4092 | + .icon { |
4093 | + position: absolute; |
4094 | + top: 10px; |
4095 | + right: 10px; |
4096 | + display: inline-block; |
4097 | + } |
4098 | + } |
4099 | + |
4100 | + &.form__group--subtle { |
4101 | + |
4102 | + .form__group-label { |
4103 | + color: $warm-grey; |
4104 | + } |
4105 | + |
4106 | + input, |
4107 | + select, |
4108 | + textarea { |
4109 | + border-color: $mercury-grey; |
4110 | + background-color: transparent; |
4111 | + |
4112 | + &:hover { |
4113 | + border-color: $mid-grey; |
4114 | + background-color: $white; |
4115 | + outline: none; |
4116 | + } |
4117 | + |
4118 | + &:active, |
4119 | + &:focus { |
4120 | + border-color: $warm-grey; |
4121 | + background-color: $white; |
4122 | + outline: none; |
4123 | + } |
4124 | + } |
4125 | + } |
4126 | + } |
4127 | + |
4128 | + .form__fieldset { |
4129 | + |
4130 | + .form__group:last-of-type { |
4131 | + margin-bottom: 0; |
4132 | + } |
4133 | + } |
4134 | + |
4135 | + .form__siblings { |
4136 | + float: left; |
4137 | + width: 100%; |
4138 | + margin-bottom: 10px; |
4139 | + |
4140 | + &:hover { |
4141 | + |
4142 | + .form__group--subtle { |
4143 | + |
4144 | + input, |
4145 | + select, |
4146 | + textarea { |
4147 | + border-color: $mid-grey; |
4148 | + background-color: $white; |
4149 | + outline: none; |
4150 | + } |
4151 | + } |
4152 | + } |
4153 | + |
4154 | + &.is-active { |
4155 | + |
4156 | + .form__group--subtle { |
4157 | + |
4158 | + input, |
4159 | + select, |
4160 | + textarea { |
4161 | + border-color: $mid-grey; |
4162 | + background-color: $white; |
4163 | + outline: none; |
4164 | + } |
4165 | + } |
4166 | + } |
4167 | + } |
4168 | + |
4169 | + &.form--stack { |
4170 | + |
4171 | + .form__group { |
4172 | + width: 100%; |
4173 | + float: left; |
4174 | + |
4175 | + [class*='-col'] { |
4176 | + margin-bottom: 0; |
4177 | + } |
4178 | + |
4179 | + .form__group-label { |
4180 | + margin-top: 0; |
4181 | + margin-bottom: 0; |
4182 | + line-height: 34px; |
4183 | + vertical-align: top; |
4184 | + } |
4185 | + |
4186 | + .form__group-input { |
4187 | + min-height: 34px; |
4188 | + |
4189 | + .onoffswitch { |
4190 | + margin-top: 9px; |
4191 | + } |
4192 | + } |
4193 | + } |
4194 | + } |
4195 | + |
4196 | + &.form--inline { |
4197 | + |
4198 | + .form__fieldset { |
4199 | + display: inline-block; |
4200 | + width: auto; |
4201 | + margin: 0; |
4202 | + vertical-align: middle; |
4203 | + } |
4204 | + |
4205 | + .form__group { |
4206 | + display: inline-block; |
4207 | + margin: 0 20px 0 0; |
4208 | + vertical-align: top; |
4209 | + |
4210 | + .form__group-label { |
4211 | + margin-bottom: 0; |
4212 | + margin-right: 10px; |
4213 | + vertical-align: top; |
4214 | + line-height: 34px; |
4215 | + |
4216 | + .icon--left { |
4217 | + position: absolute; |
4218 | + left: 0; |
4219 | + top: 12px; |
4220 | + } |
4221 | + } |
4222 | + |
4223 | + input, |
4224 | + select, |
4225 | + .form__group-input { |
4226 | + display: inline-block; |
4227 | + width: auto; |
4228 | + min-height: 34px; |
4229 | + } |
4230 | + |
4231 | + [type='checkbox'] + label, |
4232 | + [type='radio'] + label { |
4233 | + line-height: 34px; |
4234 | + } |
4235 | + |
4236 | + .onoffswitch { |
4237 | + margin: 9px 0 0; |
4238 | + } |
4239 | + |
4240 | + .onoffswitch-external-label { |
4241 | + margin: 0; |
4242 | + vertical-align: middle; |
4243 | + line-height: 34px; |
4244 | + } |
4245 | + } |
4246 | + } |
4247 | + |
4248 | + .form__help-text { |
4249 | + @include font-size(14px); |
4250 | + color: $warm-grey; |
4251 | + } |
4252 | + } |
4253 | + |
4254 | + .form__error { |
4255 | + margin: 0; |
4256 | + color: $error; |
4257 | + |
4258 | + .form__error-item { |
4259 | + margin: 6px 0; |
4260 | + } |
4261 | + } |
4262 | +} |
4263 | |
4264 | === added file 'src/maasserver/static/scss/_components.icons.scss.OTHER' |
4265 | --- src/maasserver/static/scss/_components.icons.scss.OTHER 1970-01-01 00:00:00 +0000 |
4266 | +++ src/maasserver/static/scss/_components.icons.scss.OTHER 2017-04-25 09:34:40 +0000 |
4267 | @@ -0,0 +1,274 @@ |
4268 | +//// |
4269 | +/// @author Web Team at Canonical Ltd |
4270 | +/// @link http://ubuntudesign.github.io/maas-gui-vanilla-theme/docs/#mixin-maas-icons |
4271 | +/// @since 0.0.1 |
4272 | +//// |
4273 | + |
4274 | +/// Icons |
4275 | +/// @group Icons |
4276 | +@mixin maas-icons { |
4277 | + |
4278 | + .icon { |
4279 | + @include icon-size(16px); |
4280 | + padding: 0; |
4281 | + border-bottom: 0 !important; |
4282 | + display: inline-block; |
4283 | + vertical-align: middle; |
4284 | + text-indent: 999em; |
4285 | + |
4286 | + &.icon--add { |
4287 | + background: url('#{$asset-path}images/icons/add.svg') no-repeat; |
4288 | + background-size: 100% 100%; |
4289 | + } |
4290 | + |
4291 | + &.icon--account { |
4292 | + background: url('#{$asset-path}images/icons/account.svg') no-repeat; |
4293 | + background-size: 100% 100%; |
4294 | + } |
4295 | + |
4296 | + &.icon--cross { |
4297 | + background: url('#{$asset-path}images/icons/cross.svg') no-repeat; |
4298 | + background-size: 100% 100%; |
4299 | + } |
4300 | + |
4301 | + &.icon--cross-orange { |
4302 | + background: url('#{$asset-path}images/icons/cross-orange.svg') no-repeat; |
4303 | + background-size: 100% 100%; |
4304 | + } |
4305 | + |
4306 | + &.icon--debug { |
4307 | + background: url('#{$asset-path}images/icons/debug.svg') no-repeat; |
4308 | + background-size: 100% 100%; |
4309 | + } |
4310 | + |
4311 | + &.icon--delete { |
4312 | + background: url('#{$asset-path}images/icons/delete.svg') no-repeat; |
4313 | + background-size: 100% 100%; |
4314 | + } |
4315 | + |
4316 | + &.icon--edit { |
4317 | + background: url('#{$asset-path}images/icons/edit.svg') no-repeat; |
4318 | + background-size: 100% 100%; |
4319 | + } |
4320 | + |
4321 | + &.icon--error { |
4322 | + background: url('#{$asset-path}images/icons/error.svg') no-repeat; |
4323 | + background-size: 100% 100%; |
4324 | + } |
4325 | + |
4326 | + &.icon--help { |
4327 | + background: url('#{$asset-path}images/icons/help.svg') no-repeat; |
4328 | + background-size: 100% 100%; |
4329 | + } |
4330 | + |
4331 | + &.icon--info { |
4332 | + background: url('#{$asset-path}images/icons/info.svg') no-repeat; |
4333 | + background-size: 100% 100%; |
4334 | + } |
4335 | + |
4336 | + &.icon--loading { |
4337 | + background: url('#{$asset-path}images/icons/loading.png') no-repeat; |
4338 | + background-size: 100% 100%; |
4339 | + } |
4340 | + |
4341 | + &.icon--mount { |
4342 | + background: url('#{$asset-path}images/icons/mount.svg') no-repeat; |
4343 | + background-size: 100% 100%; |
4344 | + } |
4345 | + |
4346 | + &.icon--unmount { |
4347 | + background: url('#{$asset-path}images/icons/unmount.svg') no-repeat; |
4348 | + background-size: 100% 100%; |
4349 | + } |
4350 | + |
4351 | + &.icon--partition { |
4352 | + background: url('#{$asset-path}images/icons/partition.svg') no-repeat; |
4353 | + background-size: 100% 100%; |
4354 | + } |
4355 | + |
4356 | + &.icon--power-error { |
4357 | + background: url('#{$asset-path}images/icons/power-error.svg') no-repeat; |
4358 | + background-size: 100% 100%; |
4359 | + } |
4360 | + |
4361 | + &.icon--power-off { |
4362 | + background: url('#{$asset-path}images/icons/power-off.svg') no-repeat; |
4363 | + background-size: 100% 100%; |
4364 | + } |
4365 | + |
4366 | + &.icon--power-on { |
4367 | + background: url('#{$asset-path}images/icons/power-on.svg') no-repeat; |
4368 | + background-size: 100% 100%; |
4369 | + } |
4370 | + |
4371 | + &.icon--remove { |
4372 | + background: url('#{$asset-path}images/icons/remove.svg') no-repeat; |
4373 | + background-size: 100% 100%; |
4374 | + } |
4375 | + |
4376 | + &.icon--success { |
4377 | + background: url('#{$asset-path}images/icons/success.svg') no-repeat; |
4378 | + background-size: 100% 100%; |
4379 | + |
4380 | + &-mono { |
4381 | + background: url('#{$asset-path}images/icons/success-mono.svg') no-repeat; |
4382 | + background-size: 100% 100%; |
4383 | + } |
4384 | + |
4385 | + &-grey { |
4386 | + background: url('data:image/svg+xml;utf8, <svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="success"><rect id="rect6708" x="0" y="9.99999989e-06" width="16" height="16"></rect><circle id="circle6710" stroke="#{$warm-grey}" stroke-width="1.5" fill="#{$warm-grey}" cx="8" cy="8.00001" r="7.2500086"></circle><polygon id="path6712" fill="#{$white}" points="11.80029 4.92345 11.73439 4.98115 6.99964 9.12837 4.22407 6.74743 3.38501 7.69631 7.00033 11.50002 12.5 5.71278 11.80029 4.92349"></polygon></g></g></svg>'); |
4387 | + background-size: 100% 100%; |
4388 | + } |
4389 | + } |
4390 | + |
4391 | + &.icon--settings { |
4392 | + background: url('#{$asset-path}images/icons/settings.svg') no-repeat; |
4393 | + background-size: 100% 100%; |
4394 | + } |
4395 | + |
4396 | + &.icon--sync { |
4397 | + background: url('#{$asset-path}images/icons/sync.svg') no-repeat; |
4398 | + background-size: 100% 100%; |
4399 | + } |
4400 | + |
4401 | + &.icon--search { |
4402 | + background: url('#{$asset-path}images/icons/magnifying_glass.svg') no-repeat; |
4403 | + background-size: 100% 100%; |
4404 | + } |
4405 | + |
4406 | + &.icon--system-shutdown { |
4407 | + background: url('#{$asset-path}images/icons/system-shutdown.svg') no-repeat; |
4408 | + background-size: 100% 100%; |
4409 | + } |
4410 | + |
4411 | + &.icon--tooltip { |
4412 | + background: url('#{$asset-path}images/icons/tooltip.svg') no-repeat; |
4413 | + background-size: 100% 100%; |
4414 | + } |
4415 | + |
4416 | + &.icon--tags { |
4417 | + background: url('#{$asset-path}images/icons/tags.svg') no-repeat; |
4418 | + background-size: 100% 100%; |
4419 | + } |
4420 | + |
4421 | + &.icon--tick { |
4422 | + background: url('#{$asset-path}images/icons/tick.svg') no-repeat; |
4423 | + background-size: 100% 100%; |
4424 | + } |
4425 | + |
4426 | + &.icon--logical-volume { |
4427 | + background: url('#{$asset-path}images/icons/logical-volume.svg') no-repeat; |
4428 | + background-size: 100% 100%; |
4429 | + } |
4430 | + |
4431 | + &.icon--warning { |
4432 | + background: url('#{$asset-path}images/icons/warning.svg') no-repeat; |
4433 | + background-size: 100% 100%; |
4434 | + |
4435 | + &-mono { |
4436 | + background: url('#{$asset-path}images/icons/warning-mono.svg') no-repeat; |
4437 | + } |
4438 | + } |
4439 | + |
4440 | + &.icon--open { |
4441 | + background: url('#{$asset-path}images/forms/chevron-down.svg') no-repeat; |
4442 | + background-size: 10px 4px; |
4443 | + background-position: center 4px; |
4444 | + } |
4445 | + |
4446 | + &.icon--close { |
4447 | + background: url('#{$asset-path}images/forms/chevron-up.svg') no-repeat; |
4448 | + background-size: 10px 4px; |
4449 | + background-position: center 4px; |
4450 | + } |
4451 | + |
4452 | + &--status-failed { |
4453 | + //scss-lint:disable PlaceholderInExtend |
4454 | + @extend .icon; |
4455 | + //scss-link:enable PlaceholderInExtend |
4456 | + content: url('data:image/svg+xml;utf8, <svg width="16px" height="16px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="status-queued" transform="translate(1, 1)"><g id="Page-1"><g id="status-queued"><g id="Group"><circle id="Oval" stroke="#{$status-failed}" stroke-width="2" cx="6" cy="6" r="6"></circle><circle id="Oval-Copy" class="status-circle" fill="#{$status-failed}" cx="6" cy="6" r="4"></circle></g></g></g></g></g></svg>'); |
4457 | + } |
4458 | + |
4459 | + &--status-in-progress { |
4460 | + //scss-lint:disable PlaceholderInExtend |
4461 | + @extend .icon; |
4462 | + //scss-link:enable PlaceholderInExtend |
4463 | + content: url('data:image/svg+xml;utf8, <svg width="16px" height="16px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="status-queued" transform="translate(1, 1)"><g id="Page-1"><g id="status-queued"><g id="Group"><circle id="Oval" stroke="#{$status-in-progress}" stroke-width="2" cx="6" cy="6" r="6"></circle><circle id="Oval-Copy" class="status-circle" fill="#{$status-in-progress}" cx="6" cy="6" r="4"></circle></g></g></g></g></g></svg>'); |
4464 | + } |
4465 | + |
4466 | + &--status-queued { |
4467 | + //scss-lint:disable PlaceholderInExtend |
4468 | + @extend .icon; |
4469 | + //scss-link:enable PlaceholderInExtend |
4470 | + content: url('data:image/svg+xml;utf8, <svg width="16px" height="16px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="status-queued" transform="translate(1, 1)"><g id="Page-1"><g id="status-queued"><g id="Group"><circle id="Oval" stroke="#{$status-queued}" stroke-width="2" cx="6" cy="6" r="6"></circle><circle id="Oval-Copy" class="status-circle" fill="#{$status-queued}" cx="6" cy="6" r="4"></circle></g></g></g></g></g></svg>'); |
4471 | + } |
4472 | + |
4473 | + &--status-succeeded { |
4474 | + //scss-lint:disable PlaceholderInExtend |
4475 | + @extend .icon; |
4476 | + //scss-link:enable PlaceholderInExtend |
4477 | + content: url('data:image/svg+xml;utf8, <svg width="16px" height="16px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="status-queued" transform="translate(1, 1)"><g id="Page-1"><g id="status-queued"><g id="Group"><circle id="Oval" stroke="#{$status-succeeded}" stroke-width="2" cx="6" cy="6" r="6"></circle><circle id="Oval-Copy" class="status-circle" fill="#{$status-succeeded}" cx="6" cy="6" r="4"></circle></g></g></g></g></g></svg>'); |
4478 | + } |
4479 | + |
4480 | + &--status-waiting { |
4481 | + //scss-lint:disable PlaceholderInExtend |
4482 | + @extend .icon; |
4483 | + //scss-link:enable PlaceholderInExtend |
4484 | + content: url('data:image/svg+xml;utf8, <svg width="16px" height="16px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="status-queued" transform="translate(1, 1)"><g id="Page-1"><g id="status-queued"><g id="Group"><circle id="Oval" stroke="#{$status-waiting}" stroke-width="2" cx="6" cy="6" r="6"></circle><circle id="Oval-Copy" class="status-circle" fill="#{$status-waiting}" cx="6" cy="6" r="4"></circle></g></g></g></g></g></svg>'); |
4485 | + } |
4486 | + } |
4487 | + |
4488 | + /// Set a specific icon size |
4489 | + .icon--small { |
4490 | + @include icon-size(14px); |
4491 | + } |
4492 | + |
4493 | + .icon--large { |
4494 | + @include icon-size(20px); |
4495 | + } |
4496 | + |
4497 | + .icon--mega { |
4498 | + @include icon-size(23px); |
4499 | + } |
4500 | + |
4501 | + .icon--gigantic { |
4502 | + @include icon-size(32px); |
4503 | + } |
4504 | + |
4505 | + /// Icon alignment for headings / text |
4506 | + h1 { |
4507 | + |
4508 | + .icon { |
4509 | + margin-top: -6px; |
4510 | + } |
4511 | + } |
4512 | + |
4513 | + h2, |
4514 | + h3 { |
4515 | + |
4516 | + .icon { |
4517 | + margin-top: -5px; |
4518 | + } |
4519 | + } |
4520 | + |
4521 | + h4, |
4522 | + h5, |
4523 | + p, |
4524 | + label, |
4525 | + button, |
4526 | + a, |
4527 | + th, |
4528 | + td, |
4529 | + .table__header, |
4530 | + .table__data { |
4531 | + |
4532 | + .icon { |
4533 | + margin-top: -3px; |
4534 | + } |
4535 | + } |
4536 | +} |
4537 | + |
4538 | +@mixin icon-size($size) { |
4539 | + width: $size; |
4540 | + height: $size; |
4541 | +} |
4542 | |
4543 | === added file 'src/maasserver/static/scss/_components.tables.scss.OTHER' |
4544 | --- src/maasserver/static/scss/_components.tables.scss.OTHER 1970-01-01 00:00:00 +0000 |
4545 | +++ src/maasserver/static/scss/_components.tables.scss.OTHER 2017-04-25 09:34:40 +0000 |
4546 | @@ -0,0 +1,668 @@ |
4547 | +//// |
4548 | +/// @author Web Team at Canonical Ltd |
4549 | +/// @link http://ubuntudesign.github.io/maas-gui-vanilla-theme/docs/#mixin-maas-table |
4550 | +/// @since 0.0.3 |
4551 | +//// |
4552 | + |
4553 | +/// MAAS table styling |
4554 | +/// @group maas table |
4555 | +@mixin maas-table { |
4556 | + @include tables($alto-grey, $warm-grey, 16px, 13px); |
4557 | + @include table-columns(100); |
4558 | +} |
4559 | + |
4560 | +// scss-lint:disable SelectorFormat |
4561 | +@mixin tables($table-border-color, $table-header-color, $table-font-size, $table-header-size) { |
4562 | + |
4563 | + // scss-lint:disable NestingDepth |
4564 | + |
4565 | + // Here is the main placeholder styles for tables. All main elements can be |
4566 | + // changed or amended here and will effect standard table markup / class based |
4567 | + // div created tables. |
4568 | + %table { |
4569 | + border-color: $table-border-color; |
4570 | + border-spacing: 0; |
4571 | + overflow-x: scroll; |
4572 | + margin: 0 0 20px; |
4573 | + width: 100%; |
4574 | + text-align: left; |
4575 | + border-collapse: separate; |
4576 | + |
4577 | + // Table row styles |
4578 | + %table-row { |
4579 | + width: 100%; |
4580 | + border-color: rgb(178, 178, 178); |
4581 | + border-bottom-style: dotted; |
4582 | + border-bottom-width: 1px; |
4583 | + } |
4584 | + |
4585 | + // Table cell styles |
4586 | + %table-cell { |
4587 | + @include font-size($table-font-size); |
4588 | + padding: 10px; |
4589 | + box-sizing: border-box; |
4590 | + min-height: 21px; |
4591 | + background: none; |
4592 | + border: 0; |
4593 | + text-align: left; |
4594 | + border-collapse: separate; |
4595 | + vertical-align: top; |
4596 | + backface-visibility: hidden; |
4597 | + position: relative; |
4598 | + } |
4599 | + |
4600 | + // Table header row styles |
4601 | + %table-header-row { |
4602 | + color: $table-header-color; |
4603 | + border-bottom: 1px solid; |
4604 | + |
4605 | + &:hover { |
4606 | + background-color: transparent; |
4607 | + } |
4608 | + } |
4609 | + |
4610 | + // Table header cell styles |
4611 | + %table-header { |
4612 | + @include font-size($table-header-size); |
4613 | + background: none; |
4614 | + color: $table-header-color; |
4615 | + font-size: 13px; |
4616 | + |
4617 | + input { |
4618 | + |
4619 | + &[type="radio"], |
4620 | + &[type="checkbox"] { |
4621 | + |
4622 | + + label { |
4623 | + margin: 0; |
4624 | + top: -3px; |
4625 | + } |
4626 | + } |
4627 | + } |
4628 | + } |
4629 | + |
4630 | + // Table header hyperlink styles |
4631 | + %table-header-link { |
4632 | + color: $table-header-color; |
4633 | + border-bottom: 0; |
4634 | + |
4635 | + &:hover { |
4636 | + color: $text-color; |
4637 | + text-decoration: none; |
4638 | + } |
4639 | + |
4640 | + // Sorting and active styles when filtering a table |
4641 | + &.is-active { |
4642 | + color: $text-color; |
4643 | + text-decoration: none; |
4644 | + } |
4645 | + |
4646 | + &.is-sorted { |
4647 | + border-bottom: 1px solid $text-color; |
4648 | + } |
4649 | + } |
4650 | + |
4651 | + // Table divide is used for multiple table header options |
4652 | + %table-divide { |
4653 | + width: 1px; |
4654 | + display: inline-block; |
4655 | + background: $table-header-color; |
4656 | + height: 10px; |
4657 | + margin: 0 5px; |
4658 | + } |
4659 | + |
4660 | + .numerical { |
4661 | + text-align: right; |
4662 | + } |
4663 | + |
4664 | + // Generic table form elements, covers general alignment of common form |
4665 | + // elements which can be found in all tables. |
4666 | + input { |
4667 | + |
4668 | + &[type="radio"], |
4669 | + &[type="checkbox"] { |
4670 | + |
4671 | + + label { |
4672 | + margin: 0; |
4673 | + top: -1px; |
4674 | + } |
4675 | + } |
4676 | + } |
4677 | + } |
4678 | + |
4679 | + // Generic table styles, this is to be used for simple display of data which |
4680 | + // doesn't reqire dropdowns or form input interaction. Example would be a |
4681 | + // listing of machines or generic report information. |
4682 | + // |
4683 | + // @example |
4684 | + // <table> |
4685 | + // <thead> |
4686 | + // <tr> |
4687 | + // <th>...</th> |
4688 | + // ... |
4689 | + // </tr> |
4690 | + // </thead> |
4691 | + // <tfoot> |
4692 | + // <tr> |
4693 | + // <td>...</td> |
4694 | + // ... |
4695 | + // </tr> |
4696 | + // </tfoot> |
4697 | + // <tbody> |
4698 | + // <tr> |
4699 | + // <td>...</td> |
4700 | + // ... |
4701 | + // </tr> |
4702 | + // </tbody> |
4703 | + // </table> |
4704 | + table { |
4705 | + @extend %table; |
4706 | + |
4707 | + tr { |
4708 | + @extend %table-row; |
4709 | + } |
4710 | + |
4711 | + th, |
4712 | + td { |
4713 | + @extend %table-cell; |
4714 | + } |
4715 | + |
4716 | + th { |
4717 | + color: $table-header-color; |
4718 | + border-bottom: 1px solid; |
4719 | + } |
4720 | + |
4721 | + td { |
4722 | + border-color: rgb(178, 178, 178); |
4723 | + border-bottom-style: dotted; |
4724 | + border-bottom-width: 1px; |
4725 | + |
4726 | + a:link, |
4727 | + a:visited { |
4728 | + color: $text-color; |
4729 | + border-bottom: 1px solid $link-border; |
4730 | + |
4731 | + &:hover { |
4732 | + text-decoration: none; |
4733 | + color: $link-hover; |
4734 | + } |
4735 | + } |
4736 | + } |
4737 | + |
4738 | + thead { |
4739 | + width: 100% !important; |
4740 | + display: table-header-group !important; |
4741 | + |
4742 | + tr { |
4743 | + @extend %table-header-row; |
4744 | + } |
4745 | + |
4746 | + th { |
4747 | + @extend %table-header; |
4748 | + |
4749 | + a:link, |
4750 | + a:visited { |
4751 | + @extend %table-header-link; |
4752 | + } |
4753 | + } |
4754 | + |
4755 | + &.table__head--sticky { |
4756 | + background: $white; |
4757 | + padding: 0; |
4758 | + width: 100vw !important; |
4759 | + left: 0 !important; |
4760 | + right: 0 !important; |
4761 | + height: auto; |
4762 | + |
4763 | + tr { |
4764 | + max-width: $site-max-width; |
4765 | + width: 100%; |
4766 | + margin: 0 auto; |
4767 | + display: block; |
4768 | + float: none; |
4769 | + border-bottom: 0; |
4770 | + overflow: hidden; |
4771 | + |
4772 | + th { |
4773 | + border-bottom: 0; |
4774 | + float: left; |
4775 | + } |
4776 | + } |
4777 | + } |
4778 | + |
4779 | + .divide { |
4780 | + @extend %table-divide; |
4781 | + } |
4782 | + } |
4783 | + } |
4784 | + |
4785 | + // Table styles used to replicate the table layout but where extra interaction |
4786 | + // can not be created using standard table elements. This includes in table |
4787 | + // form editing, dropdown elements and layouts not possibile using tables. |
4788 | + // |
4789 | + // @example |
4790 | + // <div class="table"> |
4791 | + // <header class="table__head"> |
4792 | + // <div class="table__row"> |
4793 | + // <div class="table__header">...</div> |
4794 | + // ... |
4795 | + // </div> |
4796 | + // </div> |
4797 | + // <footer class="table__footer"> |
4798 | + // <div class="table__row"> |
4799 | + // <div class="table__data>...</div> |
4800 | + // ... |
4801 | + // </div> |
4802 | + // </footer> |
4803 | + // <section class="table__body"> |
4804 | + // <div class="table__row"> |
4805 | + // <div class="table__data>...</div> |
4806 | + // ... |
4807 | + // </div> |
4808 | + // </section> |
4809 | + // </div> |
4810 | + .table { |
4811 | + @extend %table; |
4812 | + display: table; |
4813 | + |
4814 | + // Table row style |
4815 | + .table__row { |
4816 | + @extend %table-row; |
4817 | + float: left; |
4818 | + display: table-row; |
4819 | + |
4820 | + // Table row hover style, this can reveal control elements |
4821 | + &:hover { |
4822 | + background-color: $white; |
4823 | + |
4824 | + // Set controls z-index and opacity so it is visible |
4825 | + .table__controls { |
4826 | + z-index: 1; |
4827 | + opacity: 1; |
4828 | + |
4829 | + &--secondary { |
4830 | + z-index: 1; |
4831 | + opacity: 1; |
4832 | + } |
4833 | + } |
4834 | + } |
4835 | + |
4836 | + // Active state on .table__row |
4837 | + &.is-active { |
4838 | + background-color: $white; |
4839 | + |
4840 | + .table__controls { |
4841 | + z-index: 1; |
4842 | + opacity: 1; |
4843 | + |
4844 | + &--secondary { |
4845 | + z-index: 1; |
4846 | + opacity: 1; |
4847 | + } |
4848 | + } |
4849 | + |
4850 | + .table__dropdown { |
4851 | + |
4852 | + .table__row { |
4853 | + display: none; |
4854 | + |
4855 | + &.is-active { |
4856 | + display: block; |
4857 | + } |
4858 | + } |
4859 | + } |
4860 | + } |
4861 | + } |
4862 | + |
4863 | + .table__header, |
4864 | + .table__data { |
4865 | + @extend %table-cell; |
4866 | + display: table-cell; |
4867 | + float: left; |
4868 | + } |
4869 | + |
4870 | + .table__data { |
4871 | + |
4872 | + a:link, |
4873 | + a:visited { |
4874 | + color: $text-color; |
4875 | + border-bottom: 1px solid $link-border; |
4876 | + |
4877 | + &:hover { |
4878 | + text-decoration: none; |
4879 | + color: $link-hover; |
4880 | + } |
4881 | + } |
4882 | + } |
4883 | + |
4884 | + .table__head { |
4885 | + display: table-head; |
4886 | + width: 100%; |
4887 | + box-sizing: border-box; |
4888 | + width: auto !important; |
4889 | + |
4890 | + &.table__head--sticky { |
4891 | + background: $white; |
4892 | + padding: 0; |
4893 | + width: 100vw !important; |
4894 | + left: 0 !important; |
4895 | + right: 0 !important; |
4896 | + border-top: 1px dotted $alto-grey; |
4897 | + box-shadow: 0 1px 1px rgba(0, 0, 0, .1); |
4898 | + height: auto !important; |
4899 | + |
4900 | + .table__row { |
4901 | + max-width: $site-max-width; |
4902 | + width: 100%; |
4903 | + margin: 0 auto; |
4904 | + display: block; |
4905 | + float: none; |
4906 | + border-bottom: 0; |
4907 | + overflow: hidden; |
4908 | + } |
4909 | + } |
4910 | + |
4911 | + .table__row { |
4912 | + @extend %table-header-row; |
4913 | + } |
4914 | + |
4915 | + .table__header { |
4916 | + @extend %table-header; |
4917 | + |
4918 | + .table__header-link { |
4919 | + @extend %table-header-link; |
4920 | + } |
4921 | + } |
4922 | + |
4923 | + .table__header-divide, |
4924 | + .divide { |
4925 | + @extend %table-divide; |
4926 | + } |
4927 | + } |
4928 | + |
4929 | + .table__body { |
4930 | + display: table-row-group; |
4931 | + } |
4932 | + |
4933 | + .table__footer { |
4934 | + display: table-footer-group; |
4935 | + } |
4936 | + |
4937 | + // Table label style used as secondary information with in a table cell. Can |
4938 | + // also be used as a toggle. |
4939 | + // |
4940 | + // @example |
4941 | + // <div class="table__data"> |
4942 | + // ... |
4943 | + // <span class="table__label"> |
4944 | + // <a href="#">Show more</a> |
4945 | + // </span> |
4946 | + // </div> |
4947 | + // |
4948 | + // <div class="table__data active"> |
4949 | + // ... |
4950 | + // <span class="table__label"> |
4951 | + // <a href="#">Hide</a> |
4952 | + // </span> |
4953 | + // </div> |
4954 | + .table__label { |
4955 | + clear: both; |
4956 | + display: block; |
4957 | + margin-top: 5px; |
4958 | + line-height: 16px; |
4959 | + color: $pale-grey; |
4960 | + |
4961 | + a { |
4962 | + color: $pale-grey; |
4963 | + |
4964 | + &:hover { |
4965 | + color: $link-color; |
4966 | + } |
4967 | + } |
4968 | + |
4969 | + &.is-active { |
4970 | + |
4971 | + a { |
4972 | + color: $link-color; |
4973 | + } |
4974 | + } |
4975 | + } |
4976 | + |
4977 | + // Table contol container, hidden unless hovered on the table row. Will have |
4978 | + // action controls which can effect the parent table row or other actions. |
4979 | + // |
4980 | + // @example |
4981 | + // <div class="table"> |
4982 | + // <div class="table__row"> |
4983 | + // <div class="table__data"> |
4984 | + // ... |
4985 | + // </div> |
4986 | + // <div class="table__data"> |
4987 | + // <div class="table__controls"> |
4988 | + // <a href="#">Delete</a> |
4989 | + // <a href="#">Save</a> |
4990 | + // </div> |
4991 | + // </div> |
4992 | + // </div> |
4993 | + // </div> |
4994 | + .table__controls { |
4995 | + width: 100%; |
4996 | + text-align: right; |
4997 | + opacity: 0; |
4998 | + z-index: -1000; |
4999 | + |
5000 | + &--secondary { |
The diff has been truncated for viewing.