Add Delete Network call to NMAgent client (#2050)

* Add DeleteNetwork call to NMAgent client

* Clean up comments and unused struct tags

---------

Co-authored-by: Diego Becerra <diegobecerra@microsoft.com>
This commit is contained in:
Diego Becerra 2023-07-14 14:23:57 -07:00 коммит произвёл GitHub
Родитель c1a1408887
Коммит 89cbe46bc6
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
3 изменённых файлов: 121 добавлений и 2 удалений

Просмотреть файл

@ -77,6 +77,25 @@ func (c *Client) JoinNetwork(ctx context.Context, jnr JoinNetworkRequest) error
return err // nolint:wrapcheck // wrapping this just introduces noise
}
// DeleteNetwork deletes a customer network and it's associated subnets.
func (c *Client) DeleteNetwork(ctx context.Context, dnr DeleteNetworkRequest) error {
req, err := c.buildRequest(ctx, dnr)
if err != nil {
return errors.Wrap(err, "building request")
}
resp, err := c.httpClient.Do(req) // nolint:govet // the shadow is intentional
if err != nil {
return errors.Wrap(err, "submitting request")
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return die(resp.StatusCode, resp.Header, resp.Body)
}
return nil
}
// GetNetworkConfiguration retrieves the configuration of a customer's virtual
// network. Only subnets which have been delegated will be returned.
func (c *Client) GetNetworkConfiguration(ctx context.Context, gncr GetNetworkConfigRequest) (VirtualNetwork, error) {

Просмотреть файл

@ -78,7 +78,6 @@ func TestNMAgentClientJoinNetwork(t *testing.T) {
defer cancel()
// attempt to join network
// TODO(timraymond): need a more realistic network ID, I think
err := client.JoinNetwork(ctx, nmagent.JoinNetworkRequest{test.id})
checkErr(t, err, test.shouldErr)
@ -123,6 +122,68 @@ func TestNMAgentClientJoinNetworkRetry(t *testing.T) {
}
}
func TestNMAgentClientDeleteNetwork(t *testing.T) {
deleteNetTests := []struct {
name string
id string
exp string
respStatus int
shouldErr bool
}{
{
"happy path",
"00000000-0000-0000-0000-000000000000",
"/machine/plugins?comp=nmagent&type=NetworkManagement%2FjoinedVirtualNetworks%2F00000000-0000-0000-0000-000000000000%2Fapi-version%2F1%2Fmethod%2FDELETE",
http.StatusOK,
false,
},
{
"empty network ID",
"",
"",
http.StatusOK, // this shouldn't be checked
true,
},
{
"internal error",
"00000000-0000-0000-0000-000000000000",
"/machine/plugins?comp=nmagent&type=NetworkManagement%2FjoinedVirtualNetworks%2F00000000-0000-0000-0000-000000000000%2Fapi-version%2F1%2Fmethod%2FDELETE",
http.StatusInternalServerError,
true,
},
}
for _, test := range deleteNetTests {
test := test
t.Run(test.name, func(t *testing.T) {
t.Parallel()
// create a client
var got string
client := nmagent.NewTestClient(&TestTripper{
RoundTripF: func(req *http.Request) (*http.Response, error) {
got = req.URL.RequestURI()
rr := httptest.NewRecorder()
_, _ = fmt.Fprintf(rr, `{"httpStatusCode":"%d"}`, test.respStatus)
rr.WriteHeader(http.StatusOK)
return rr.Result(), nil
},
})
ctx, cancel := testContext(t)
defer cancel()
// attempt to delete network
err := client.DeleteNetwork(ctx, nmagent.DeleteNetworkRequest{test.id})
checkErr(t, err, test.shouldErr)
if got != test.exp {
t.Error("received URL differs from expectation: got", got, "exp:", test.exp)
}
})
}
}
func TestWSError(t *testing.T) {
const wsError string = `
<?xml version="1.0" encoding="utf-8"?>

Просмотреть файл

@ -239,7 +239,7 @@ func (p *Policy) UnmarshalJSON(in []byte) error {
var _ Request = JoinNetworkRequest{}
type JoinNetworkRequest struct {
NetworkID string `validate:"presence" json:"-"` // the customer's VNet ID
NetworkID string `json:"-"` // the customer's VNet ID
}
// Path constructs a URL path for invoking a JoinNetworkRequest using the
@ -273,6 +273,45 @@ func (j JoinNetworkRequest) Validate() error {
return err
}
var _ Request = DeleteNetworkRequest{}
// DeleteNetworkRequest represents all information necessary to request that
// NMAgent delete a particular network
type DeleteNetworkRequest struct {
NetworkID string `json:"-"` // the customer's VNet ID
}
// Path constructs a URL path for invoking a DeleteNetworkRequest using the
// provided parameters
func (d DeleteNetworkRequest) Path() string {
const DeleteNetworkPath = "/NetworkManagement/joinedVirtualNetworks/%s/api-version/1/method/DELETE"
return fmt.Sprintf(DeleteNetworkPath, d.NetworkID)
}
// Body returns nothing, because DeleteNetworkRequest has no request body
func (d DeleteNetworkRequest) Body() (io.Reader, error) {
return nil, nil
}
// Method returns the HTTP request method to submit a DeleteNetworkRequest
func (d DeleteNetworkRequest) Method() string {
return http.MethodPost
}
// Validate ensures that the provided parameters of the request are valid
func (d DeleteNetworkRequest) Validate() error {
err := internal.ValidationError{}
if d.NetworkID == "" {
err.MissingFields = append(err.MissingFields, "NetworkID")
}
if err.IsEmpty() {
return nil
}
return err
}
var _ Request = DeleteContainerRequest{}
// DeleteContainerRequest represents all information necessary to request that