@@ -73,17 +73,20 @@ func (c *testCluster) RandomManager() *testNode {
7373 return managers [idx ]
7474}
7575
76- // AddManager adds node with Manager role(both agent and manager).
77- func (c * testCluster ) AddManager () error {
76+ // AddManager adds a node with the Manager role. The node will function as both
77+ // an agent and a manager. If lateBind is set, the manager is started before a
78+ // remote API port is bound. This setting only applies to the first manager.
79+ func (c * testCluster ) AddManager (lateBind bool ) error {
7880 // first node
7981 var n * testNode
8082 if len (c .nodes ) == 0 {
81- node , err := newTestNode ("" , "" )
83+ node , err := newTestNode ("" , "" , lateBind )
8284 if err != nil {
8385 return err
8486 }
8587 n = node
8688 } else {
89+ lateBind = false
8790 joinAddr , err := c .RandomManager ().node .RemoteAPIAddr ()
8891 if err != nil {
8992 return err
@@ -95,7 +98,7 @@ func (c *testCluster) AddManager() error {
9598 if len (clusterInfo .Clusters ) == 0 {
9699 return fmt .Errorf ("joining manager: there is no cluster created in storage" )
97100 }
98- node , err := newTestNode (joinAddr , clusterInfo .Clusters [0 ].RootCA .JoinTokens .Manager )
101+ node , err := newTestNode (joinAddr , clusterInfo .Clusters [0 ].RootCA .JoinTokens .Manager , false )
99102 if err != nil {
100103 return err
101104 }
@@ -119,6 +122,20 @@ func (c *testCluster) AddManager() error {
119122
120123 c .nodes [n .node .NodeID ()] = n
121124 c .nodesOrder [n .node .NodeID ()] = c .counter
125+
126+ if lateBind {
127+ // Verify that the control API works
128+ clusterInfo , err := c .api .ListClusters (context .Background (), & api.ListClustersRequest {})
129+ if err != nil {
130+ return err
131+ }
132+ if len (clusterInfo .Clusters ) == 0 {
133+ return fmt .Errorf ("joining manager: there is no cluster created in storage" )
134+ }
135+
136+ return n .node .BindRemote (context .Background (), "127.0.0.1:0" , "" )
137+ }
138+
122139 return nil
123140}
124141
@@ -140,7 +157,7 @@ func (c *testCluster) AddAgent() error {
140157 if len (clusterInfo .Clusters ) == 0 {
141158 return fmt .Errorf ("joining agent: there is no cluster created in storage" )
142159 }
143- node , err := newTestNode (joinAddr , clusterInfo .Clusters [0 ].RootCA .JoinTokens .Worker )
160+ node , err := newTestNode (joinAddr , clusterInfo .Clusters [0 ].RootCA .JoinTokens .Worker , false )
144161 if err != nil {
145162 return err
146163 }
0 commit comments