Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Updating API usage of IPsec tunnels #908

Merged
merged 1 commit into from Jun 7, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
59 changes: 51 additions & 8 deletions magic_transit_ipsec_tunnel.go
Expand Up @@ -16,16 +16,31 @@ const (
errMagicTransitIPsecTunnelNotDeleted = "When trying to delete IPsec tunnel, API returned deleted: false"
)

type RemoteIdentities struct {
HexID string `json:"hex_id"`
FQDNID string `json:"fqdn_id"`
UserID string `json:"user_id"`
}

// MagicTransitIPsecTunnelPskMetadata contains metadata associated with PSK.
type MagicTransitIPsecTunnelPskMetadata struct {
LastGeneratedOn *time.Time `json:"last_generated_on,omitempty"`
}

// MagicTransitIPsecTunnel contains information about an IPsec tunnel.
type MagicTransitIPsecTunnel struct {
ID string `json:"id,omitempty"`
CreatedOn *time.Time `json:"created_on,omitempty"`
ModifiedOn *time.Time `json:"modified_on,omitempty"`
Name string `json:"name"`
CustomerEndpoint string `json:"customer_endpoint"`
CloudflareEndpoint string `json:"cloudflare_endpoint"`
InterfaceAddress string `json:"interface_address"`
Description string `json:"description,omitempty"`
ID string `json:"id,omitempty"`
CreatedOn *time.Time `json:"created_on,omitempty"`
ModifiedOn *time.Time `json:"modified_on,omitempty"`
Name string `json:"name"`
CustomerEndpoint string `json:"customer_endpoint"`
CloudflareEndpoint string `json:"cloudflare_endpoint"`
InterfaceAddress string `json:"interface_address"`
Description string `json:"description,omitempty"`
HealthCheck *MagicTransitTunnelHealthcheck `json:"health_check,omitempty"`
Psk string `json:"psk,omitempty"`
PskMetadata *MagicTransitIPsecTunnelPskMetadata `json:"psk_metadata,omitempty"`
RemoteIdentities *RemoteIdentities `json:"remote_identities,omitempty"`
}

// ListMagicTransitIPsecTunnelsResponse contains a response including IPsec tunnels.
Expand Down Expand Up @@ -67,6 +82,15 @@ type DeleteMagicTransitIPsecTunnelResponse struct {
} `json:"result"`
}

// GenerateMagicTransitIPsecTunnelPSKResponse contains a response after generating IPsec Tunnel.
type GenerateMagicTransitIPsecTunnelPSKResponse struct {
Response
Result struct {
Psk string `json:"psk"`
PskMetadata *MagicTransitIPsecTunnelPskMetadata `json:"psk_metadata"`
} `json:"result"`
}

// ListMagicTransitIPsecTunnels lists all IPsec tunnels for a given account
//
// API reference: https://api.cloudflare.com/#magic-ipsec-tunnels-list-ipsec-tunnels
Expand Down Expand Up @@ -169,3 +193,22 @@ func (api *API) DeleteMagicTransitIPsecTunnel(ctx context.Context, accountID str

return result.Result.DeletedIPsecTunnel, nil
}

// GenerateMagicTransitIPsecTunnelPSK generates a pre shared key (psk) for an IPsec tunnel
//
// API reference: https://api.cloudflare.com/#magic-ipsec-tunnels-generate-pre-shared-key-psk-for-ipsec-tunnels
func (api *API) GenerateMagicTransitIPsecTunnelPSK(ctx context.Context, accountID string, id string) (string, *MagicTransitIPsecTunnelPskMetadata, error) {
uri := fmt.Sprintf("/accounts/%s/magic/ipsec_tunnels/%s/psk_generate", accountID, id)
res, err := api.makeRequestContext(ctx, http.MethodPost, uri, nil)

if err != nil {
return "", nil, err
}

result := GenerateMagicTransitIPsecTunnelPSKResponse{}
if err := json.Unmarshal(res, &result); err != nil {
return "", nil, errors.Wrap(err, errUnmarshalError)
}

return result.Result.Psk, result.Result.PskMetadata, nil
}
37 changes: 37 additions & 0 deletions magic_transit_ipsec_tunnel_test.go
Expand Up @@ -257,3 +257,40 @@ func TestDeleteMagicTransitIPsecTunnel(t *testing.T) {
assert.Equal(t, want, actual)
}
}

func TestMagicTransitIPsecTunnelGeneratePSK(t *testing.T) {
setup()
defer teardown()

handler := func(w http.ResponseWriter, r *http.Request) {
assert.Equal(t, http.MethodPost, r.Method, "Expected method 'POST', got %s", r.Method)
w.Header().Set("content-type", "application/json")
fmt.Fprint(w, `{
"success": true,
"errors": [],
"messages": [],
"result": {
"psk": "itworks",
"psk_metadata": {
"last_generated_on": "2017-06-14T05:20:00Z"
}
}
}`)
}

mux.HandleFunc("/accounts/"+testAccountID+"/magic/ipsec_tunnels/c4a7362d577a6c3019a474fd6f485821/psk_generate", handler)

lastGeneratedOn, _ := time.Parse(time.RFC3339, "2017-06-14T05:20:00Z")

want := MagicTransitIPsecTunnelPskMetadata{
LastGeneratedOn: &lastGeneratedOn,
}

want_psk := "itworks"

psk, actual, err := client.GenerateMagicTransitIPsecTunnelPSK(context.Background(), testAccountID, "c4a7362d577a6c3019a474fd6f485821")
if assert.NoError(t, err) {
assert.Equal(t, want, *actual)
assert.Equal(t, want_psk, psk)
}
}
8 changes: 8 additions & 0 deletions magic_transit_tunnel_healthcheck.go
@@ -0,0 +1,8 @@
package cloudflare

// MagicTransitTunnelHealthcheck contains information about a tunnel health check.
type MagicTransitTunnelHealthcheck struct {
Enabled bool `json:"enabled"`
Target string `json:"target,omitempty"`
Type string `json:"type,omitempty"`
}