Merge ~steverydz/maas:fix-static-ip-and-subnet-assignment into maas:master

Proposed by Steve Rydz
Status: Rejected
Rejected by: Blake Rouse
Proposed branch: ~steverydz/maas:fix-static-ip-and-subnet-assignment
Merge into: maas:master
Diff against target: 102 lines (+17/-7)
2 files modified
src/maasserver/static/js/angular/controllers/node_details_networking.js (+7/-3)
src/maasserver/static/js/angular/controllers/tests/test_node_details_networking.js (+10/-4)
Reviewer Review Type Date Requested Status
Blake Rouse (community) Disapprove
Mike Pontillo (community) Needs Information
MAAS Lander Approve
Review via email: mp+360659@code.launchpad.net

Commit message

LP: #1806099 - Make sure static IP is assigned when static mode rather than auto assigned

LP: #1806112 - Send subnet ID when creating a bridge or a bond in machine interfaces

To post a comment you must log in.
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b fix-static-ip-and-subnet-assignment lp:~steverydz/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 53d1296654513b3d3bc73e9356a18d4fee488365

review: Approve
Revision history for this message
Mike Pontillo (mpontillo) wrote :

I think the code in this branch is fine, but I think we should discuss the larger picture. Your previous merge proposal stated that back-end changes would be required to get this to work. But I think the reason that setting the IP mode and subnet doesn't work is because it was designed that way for a good reason, and we should discuss further before we change that.

That is, if I am creating a bridge, it should inherit the IP assignment from the interface I created it on. Similarly, if I create a bond, it should inherit the IP assignments from its parent. (The only difference: AUTO and DHCP assignments should be combined, and if a combination of AUTO, DHCP, and Static appear on bond parents, we should prefer static, auto, and DHCP in that order.)

Right now it's not doing that it all. In fact, instead MAAS tends to *remove* all the IP addresses rather than even trying to make a good guess.

***

With that, here are some important questions about the UX that we need to answer:

Should the user be allowed to configure the IP mode at bond or bridge creation time?

If the answer is "yes", what subset of the configuration of the currently-existing interfaces should be shown by default, so that the UI is consistent with the back-end? (We can use the algorithm I described above, but what about edge cases such as multiple static IP address assignments?)

If the answer is "no", we just need to remove IP assignment from the "add" screen and make sure that when bonds or bridges are added, MAAS does something that is predictable and unsurprising. Then we could just replace the IP assignment editing boxes that appear upon bond or bridge creation with some text that states what MAAS will do with existing IP assignments.

(Additionally, when a bond or bridge is deleted, we should probably take any IP assignments and place them on the first parent interface.)

***

I tested this with the API as well; given a machine with system_id 'ta3rxy' and two NICs (IDs 6 and 8), the minimum to create a bond is something like the following:

    maas admin interfaces create-bond ta3rxy parents=6 parents=10 name=bond0

(It fails without the `name=bond0` part.)

The documentation states that leaving out the VLAN results in "disconnected", but that turns out to not be true. In MAAS 2.5, leaving the VLAN out results in the bond being connected to the same VLAN as its parent.

Just as is the case with the UI, creating the bond results in no IP addresses being transferred to the new bond.

Similarly, this is the minimum command to create a bridge:

    maas admin interfaces create-bridge ta3rxy parents=6 name=br0

As with bonds, no IP address assignments are transferred to the new bridge.

review: Needs Information
Revision history for this message
Martin Storey (cassiocassio) wrote :
Revision history for this message
Blake Rouse (blake-rouse) wrote :
review: Disapprove

There was an error fetching revisions from git servers. Please try again in a few minutes. If the problem persists, contact Launchpad support.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/maasserver/static/js/angular/controllers/node_details_networking.js b/src/maasserver/static/js/angular/controllers/node_details_networking.js
2index b4c2eac..06dd9fa 100644
3--- a/src/maasserver/static/js/angular/controllers/node_details_networking.js
4+++ b/src/maasserver/static/js/angular/controllers/node_details_networking.js
5@@ -33,6 +33,7 @@ angular.module('MAAS').filter('filterByUnusedForInterface', function() {
6 });
7
8
9+
10 // Filter that is specific to the NodeNetworkingController. Filters the
11 // list of interfaces to not include the current parent interfaces being
12 // bonded together.
13@@ -1525,7 +1526,8 @@ angular.module('MAAS').controller('NodeNetworkingController', [
14 vlan: vlan_id,
15 bond_mode: $scope.newBondInterface.bond_mode,
16 bond_lacp_rate: $scope.newBondInterface.lacpRate,
17- bond_xmit_hash_policy: $scope.newBondInterface.xmitHashPolicy
18+ bond_xmit_hash_policy: $scope.newBondInterface.xmitHashPolicy,
19+ subnet: $scope.newBondInterface.subnet.id
20 };
21 $scope.$parent.nodesManager.createBondInterface(
22 $scope.node, params).then(null, function(error) {
23@@ -1668,7 +1670,8 @@ angular.module('MAAS').controller('NodeNetworkingController', [
24 vlan: vlan.id,
25 fabric: fabric.id,
26 bridge_stp: $scope.newBridgeInterface.bridge_stp,
27- bridge_fd: $scope.newBridgeInterface.bridge_fd
28+ bridge_fd: $scope.newBridgeInterface.bridge_fd,
29+ subnet: $scope.newBridgeInterface.subnet.id
30 };
31 $scope.$parent.nodesManager.createBridgeInterface(
32 $scope.node, params).then(null, function(error) {
33@@ -1757,7 +1760,8 @@ angular.module('MAAS').controller('NodeNetworkingController', [
34 function(tag) { return tag.text; }),
35 mac_address: $scope.newInterface.mac_address,
36 vlan: $scope.newInterface.vlan.id,
37- mode: $scope.newInterface.mode
38+ mode: $scope.newInterface.mode,
39+ ip_address: $scope.newInterface.ip_address
40 };
41 }
42 if(angular.isObject($scope.newInterface.subnet)) {
43diff --git a/src/maasserver/static/js/angular/controllers/tests/test_node_details_networking.js b/src/maasserver/static/js/angular/controllers/tests/test_node_details_networking.js
44index 85d1678..fd4be12 100644
45--- a/src/maasserver/static/js/angular/controllers/tests/test_node_details_networking.js
46+++ b/src/maasserver/static/js/angular/controllers/tests/test_node_details_networking.js
47@@ -3754,7 +3754,8 @@ describe("NodeNetworkingController", function() {
48 vlan: vlan.id,
49 bond_mode: "active-backup",
50 bond_lacp_rate: "fast",
51- bond_xmit_hash_policy: "layer2"
52+ bond_xmit_hash_policy: "layer2",
53+ subnet: undefined
54 });
55 expect($scope.interfaces).toEqual([]);
56 expect($scope.newBondInterface).toEqual({});
57@@ -3802,7 +3803,8 @@ describe("NodeNetworkingController", function() {
58 vlan: null,
59 bond_mode: "active-backup",
60 bond_lacp_rate: "fast",
61- bond_xmit_hash_policy: "layer2"
62+ bond_xmit_hash_policy: "layer2",
63+ subnet: undefined
64 });
65 expect($scope.interfaces).toEqual([]);
66 expect($scope.newBondInterface).toEqual({});
67@@ -4033,6 +4035,7 @@ describe("NodeNetworkingController", function() {
68 vlan: vlan,
69 fabric: fabric
70 };
71+
72 $scope.interfaces = [nic1];
73 $scope.interfaceLinksMap = {};
74 $scope.interfaceLinksMap[nic1.id] = {};
75@@ -4045,6 +4048,7 @@ describe("NodeNetworkingController", function() {
76 spyOn($scope, "cannotAddBridge").and.returnValue(false);
77 $scope.newBridgeInterface.name = "br0";
78 $scope.newBridgeInterface.mac_address = "00:11:22:33:44:55";
79+ $scope.newBridgeInterface.subnet = {};
80 $scope.addBridge();
81
82 expect(MachinesManager.createBridgeInterface).toHaveBeenCalledWith(
83@@ -4056,7 +4060,8 @@ describe("NodeNetworkingController", function() {
84 vlan: vlan.id,
85 fabric: fabric.id,
86 bridge_stp: false,
87- bridge_fd: 15
88+ bridge_fd: 15,
89+ subnet: undefined
90 });
91 expect($scope.interfaces).toEqual([]);
92 expect($scope.newBridgeInterface).toEqual({});
93@@ -4296,7 +4301,8 @@ describe("NodeNetworkingController", function() {
94 tags: [],
95 vlan: vlan.id,
96 subnet: subnet.id,
97- mode: "auto"
98+ mode: "auto",
99+ ip_address: undefined
100 });
101 expect($scope.newInterface).toEqual({});
102 expect($scope.selectedMode).toBeNull();

Subscribers

People subscribed via source and target branches