Skip to content

Commit c506de7

Browse files
committed
managed.go
1 parent b58f8b5 commit c506de7

File tree

2 files changed

+97
-82
lines changed

2 files changed

+97
-82
lines changed

cns/service/main.go

Lines changed: 0 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
package main
55

66
import (
7-
"bytes"
87
"context"
98
"encoding/json"
109
"fmt"
@@ -13,7 +12,6 @@ import (
1312
"os"
1413
"os/signal"
1514
"runtime"
16-
"strconv"
1715
"strings"
1816
"syscall"
1917
"time"
@@ -335,90 +333,10 @@ func init() {
335333
}()
336334
}
337335

338-
// NodeInterrogator is functionality necessary to read information about nodes.
339-
// It is intended to be strictly read-only.
340-
type NodeInterrogator interface {
341-
SupportedAPIs(context.Context) ([]string, error)
342-
}
343-
344336
type httpDoer interface {
345337
Do(req *http.Request) (*http.Response, error)
346338
}
347339

348-
// RegisterNode - Tries to register node with DNC when CNS is started in managed DNC mode
349-
func registerNode(ctx context.Context, httpClient httpDoer, httpRestService cns.HTTPService, dncEP, infraVnet, nodeID string, ni NodeInterrogator) error {
350-
logger.Printf("[Azure CNS] Registering node %s with Infrastructure Network: %s PrivateEndpoint: %s", nodeID, infraVnet, dncEP)
351-
352-
var (
353-
numCPU = runtime.NumCPU()
354-
url = fmt.Sprintf(acn.RegisterNodeURLFmt, dncEP, infraVnet, nodeID, dncApiVersion)
355-
nodeRegisterRequest cns.NodeRegisterRequest
356-
)
357-
358-
nodeRegisterRequest.NumCores = numCPU
359-
supportedApis, retErr := ni.SupportedAPIs(context.TODO())
360-
361-
if retErr != nil {
362-
return errors.Wrap(retErr, fmt.Sprintf("[Azure CNS] Failed to retrieve SupportedApis from NMagent of node %s with Infrastructure Network: %s PrivateEndpoint: %s",
363-
nodeID, infraVnet, dncEP))
364-
}
365-
366-
// To avoid any null-pointer de-referencing errors.
367-
if supportedApis == nil {
368-
supportedApis = []string{}
369-
}
370-
371-
nodeRegisterRequest.NmAgentSupportedApis = supportedApis
372-
373-
// CNS tries to register Node for maximum of an hour.
374-
err := retry.Do(func() error {
375-
return errors.Wrap(sendRegisterNodeRequest(ctx, httpClient, httpRestService, nodeRegisterRequest, url), "failed to sendRegisterNodeRequest")
376-
}, retry.Delay(acn.FiveSeconds), retry.Attempts(maxRetryNodeRegister), retry.DelayType(retry.FixedDelay))
377-
378-
return errors.Wrap(err, fmt.Sprintf("[Azure CNS] Failed to register node %s after maximum reties for an hour with Infrastructure Network: %s PrivateEndpoint: %s",
379-
nodeID, infraVnet, dncEP))
380-
}
381-
382-
// sendRegisterNodeRequest func helps in registering the node until there is an error.
383-
func sendRegisterNodeRequest(ctx context.Context, httpClient httpDoer, httpRestService cns.HTTPService, nodeRegisterRequest cns.NodeRegisterRequest, registerURL string) error {
384-
var body bytes.Buffer
385-
err := json.NewEncoder(&body).Encode(nodeRegisterRequest)
386-
if err != nil {
387-
logger.Errorf("Failed to register node while encoding json failed with non-retryable err %v", err)
388-
return errors.Wrap(retry.Unrecoverable(err), "failed to sendRegisterNodeRequest")
389-
}
390-
391-
request, err := http.NewRequestWithContext(ctx, http.MethodPost, registerURL, &body)
392-
if err != nil {
393-
return errors.Wrap(err, "failed to build request")
394-
}
395-
396-
request.Header.Set("Content-Type", "application/json")
397-
response, err := httpClient.Do(request)
398-
if err != nil {
399-
return errors.Wrap(err, "http request failed")
400-
}
401-
402-
defer response.Body.Close()
403-
404-
if response.StatusCode != http.StatusOK {
405-
err = fmt.Errorf("[Azure CNS] Failed to register node, DNC replied with http status code %s", strconv.Itoa(response.StatusCode))
406-
logger.Errorf(err.Error())
407-
return errors.Wrap(err, "failed to sendRegisterNodeRequest")
408-
}
409-
410-
var req cns.SetOrchestratorTypeRequest
411-
err = json.NewDecoder(response.Body).Decode(&req)
412-
if err != nil {
413-
logger.Errorf("decoding Node Register response json failed with err %v", err)
414-
return errors.Wrap(err, "failed to sendRegisterNodeRequest")
415-
}
416-
httpRestService.SetNodeOrchestrator(&req)
417-
418-
logger.Printf("[Azure CNS] Node Registered")
419-
return nil
420-
}
421-
422340
func startTelemetryService(ctx context.Context) {
423341
var config aitelemetry.AIConfig
424342

cns/service/managed.go

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package main
2+
3+
import (
4+
"bytes"
5+
"context"
6+
"encoding/json"
7+
"fmt"
8+
"net/http"
9+
"runtime"
10+
"strconv"
11+
12+
"github.com/Azure/azure-container-networking/cns"
13+
"github.com/Azure/azure-container-networking/cns/logger"
14+
acn "github.com/Azure/azure-container-networking/common"
15+
"github.com/avast/retry-go/v4"
16+
"github.com/pkg/errors"
17+
)
18+
19+
// NodeInterrogator is functionality necessary to read information about nodes.
20+
// It is intended to be strictly read-only.
21+
type NodeInterrogator interface {
22+
SupportedAPIs(context.Context) ([]string, error)
23+
}
24+
25+
// RegisterNode - Tries to register node with DNC when CNS is started in managed DNC mode
26+
func registerNode(ctx context.Context, httpClient httpDoer, httpRestService cns.HTTPService, dncEP, infraVnet, nodeID string, ni NodeInterrogator) error {
27+
logger.Printf("[Azure CNS] Registering node %s with Infrastructure Network: %s PrivateEndpoint: %s", nodeID, infraVnet, dncEP)
28+
29+
var (
30+
numCPU = runtime.NumCPU()
31+
url = fmt.Sprintf(acn.RegisterNodeURLFmt, dncEP, infraVnet, nodeID, dncApiVersion)
32+
nodeRegisterRequest cns.NodeRegisterRequest
33+
)
34+
35+
nodeRegisterRequest.NumCores = numCPU
36+
supportedApis, retErr := ni.SupportedAPIs(context.TODO())
37+
38+
if retErr != nil {
39+
return errors.Wrap(retErr, fmt.Sprintf("[Azure CNS] Failed to retrieve SupportedApis from NMagent of node %s with Infrastructure Network: %s PrivateEndpoint: %s",
40+
nodeID, infraVnet, dncEP))
41+
}
42+
43+
// To avoid any null-pointer de-referencing errors.
44+
if supportedApis == nil {
45+
supportedApis = []string{}
46+
}
47+
48+
nodeRegisterRequest.NmAgentSupportedApis = supportedApis
49+
50+
// CNS tries to register Node for maximum of an hour.
51+
err := retry.Do(func() error {
52+
return errors.Wrap(sendRegisterNodeRequest(ctx, httpClient, httpRestService, nodeRegisterRequest, url), "failed to sendRegisterNodeRequest")
53+
}, retry.Delay(acn.FiveSeconds), retry.Attempts(maxRetryNodeRegister), retry.DelayType(retry.FixedDelay))
54+
55+
return errors.Wrap(err, fmt.Sprintf("[Azure CNS] Failed to register node %s after maximum reties for an hour with Infrastructure Network: %s PrivateEndpoint: %s",
56+
nodeID, infraVnet, dncEP))
57+
}
58+
59+
// sendRegisterNodeRequest func helps in registering the node until there is an error.
60+
func sendRegisterNodeRequest(ctx context.Context, httpClient httpDoer, httpRestService cns.HTTPService, nodeRegisterRequest cns.NodeRegisterRequest, registerURL string) error {
61+
var body bytes.Buffer
62+
err := json.NewEncoder(&body).Encode(nodeRegisterRequest)
63+
if err != nil {
64+
logger.Errorf("Failed to register node while encoding json failed with non-retryable err %v", err)
65+
return errors.Wrap(retry.Unrecoverable(err), "failed to sendRegisterNodeRequest")
66+
}
67+
68+
request, err := http.NewRequestWithContext(ctx, http.MethodPost, registerURL, &body)
69+
if err != nil {
70+
return errors.Wrap(err, "failed to build request")
71+
}
72+
73+
request.Header.Set("Content-Type", "application/json")
74+
response, err := httpClient.Do(request)
75+
if err != nil {
76+
return errors.Wrap(err, "http request failed")
77+
}
78+
79+
defer response.Body.Close()
80+
81+
if response.StatusCode != http.StatusOK {
82+
err = fmt.Errorf("[Azure CNS] Failed to register node, DNC replied with http status code %s", strconv.Itoa(response.StatusCode))
83+
logger.Errorf(err.Error())
84+
return errors.Wrap(err, "failed to sendRegisterNodeRequest")
85+
}
86+
87+
var req cns.SetOrchestratorTypeRequest
88+
err = json.NewDecoder(response.Body).Decode(&req)
89+
if err != nil {
90+
logger.Errorf("decoding Node Register response json failed with err %v", err)
91+
return errors.Wrap(err, "failed to sendRegisterNodeRequest")
92+
}
93+
httpRestService.SetNodeOrchestrator(&req)
94+
95+
logger.Printf("[Azure CNS] Node Registered")
96+
return nil
97+
}

0 commit comments

Comments
 (0)