diff --git a/go.sum b/go.sum index 75f8d73d..782823aa 100644 --- a/go.sum +++ b/go.sum @@ -69,6 +69,12 @@ github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xP github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/dns/armdns v1.2.0 h1:lpOxwrQ919lCZoNCd69rVt8u1eLZuMORrGXqy8sNf3c= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/dns/armdns v1.2.0/go.mod h1:fSvRkb8d26z9dbL40Uf/OO6Vo9iExtZK3D0ulRV+8M0= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0 h1:PTFGRSlMKCQelWwxUyYVEUqseBJVemLyqWJjvMyt0do= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0/go.mod h1:LRr2FzBTQlONPPa5HREE5+RjSCTXl7BwOvYOaWTqCaI= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v3 v3.0.0 h1:Kb8eVvjdP6kZqYnER5w/PiGCFp91yVgaxve3d7kCEpY= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v3 v3.0.0/go.mod h1:lYq15QkJyEsNegz5EhI/0SXQ6spvGfgwBH/Qyzkoc/s= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/managementgroups/armmanagementgroups v1.0.0 h1:pPvTJ1dY0sA35JOeFq6TsY2xj6Z85Yo23Pj4wCCvu4o= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/managementgroups/armmanagementgroups v1.0.0/go.mod h1:mLfWfj8v3jfWKsL9G4eoBoXVcsqcIUTapmdKy7uGOp0= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0 h1:Dd+RhdJn0OTtVGaeDLZpcumkIVCtA/3/Fo42+eoYvVM= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0/go.mod h1:5kakwfW5CjC9KK+Q4wjXAg+ShuIm2mBMua0ZFj2C8PE= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.6.0 h1:PiSrjRPpkQNjrM8H0WwKMnZUdu1RGMtd/LdGKUrOo+c= @@ -617,7 +623,6 @@ github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3 github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -1065,8 +1070,8 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/xid v1.4.0 h1:qd7wPTDkN6KQx2VmMBLrpHkiyQwgFXRnkOLacUiaSNY= github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= @@ -1309,8 +1314,6 @@ golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30= golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1368,8 +1371,6 @@ golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.13.0 h1:I/DsJXRlw/8l/0c24sM9yb0T4z9liZTduXvdAWYiysY= -golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1440,8 +1441,6 @@ golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= -golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1474,8 +1473,6 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= -golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1588,8 +1585,6 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -1602,8 +1597,6 @@ golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= -golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk= golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1623,8 +1616,6 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1712,8 +1703,6 @@ golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= -golang.org/x/tools v0.14.0 h1:jvNa2pY0M4r62jkRQ6RwEZZyPcymeL9XZMLBbV7U2nc= -golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/internal/azure/azure.go b/internal/azure/azure.go index 29ee8a57..a0f786c6 100644 --- a/internal/azure/azure.go +++ b/internal/azure/azure.go @@ -197,3 +197,52 @@ func NewClient(clientID, clientSecret, subscriptionID, tenantID string) (*Client subscriptionID: subscriptionID, }, nil } + +func (c *Client) GetDNSDomains(ctx context.Context, resourceGroup string) ([]string, error) { + client, err := c.newDNSClientFactory() + if err != nil { + return nil, err + } + + var domains []string + pager := client.NewZonesClient().NewListByResourceGroupPager(resourceGroup, nil) + + for pager.More() { + page, err := pager.NextPage(ctx) + if err != nil { + return nil, fmt.Errorf("failed to list DNS zones: %w", err) + } + + for _, zone := range page.Value { + if zone.Name != nil { + domains = append(domains, *zone.Name) + } + } + } + + return domains, nil +} + +func (c *Client) GetResourceGroups(ctx context.Context) ([]string, error) { + client, err := c.newResourceClientFactory() + if err != nil { + return nil, err + } + + pager := client.NewResourceGroupsClient().NewListPager(nil) + + var resourceGroups []string + + for pager.More() { + page, err := pager.NextPage(ctx) + if err != nil { + return nil, fmt.Errorf("failed to list resource groups: %w", err) + } + + for _, rg := range page.Value { + resourceGroups = append(resourceGroups, *rg.Name) + } + } + + return resourceGroups, nil +} diff --git a/internal/router/api/v1/domain.go b/internal/router/api/v1/domain.go index a3689612..c01f41b8 100644 --- a/internal/router/api/v1/domain.go +++ b/internal/router/api/v1/domain.go @@ -14,6 +14,7 @@ import ( cloudflare_api "github.com/cloudflare/cloudflare-go" "github.com/gin-gonic/gin" awsinternal "github.com/konstructio/kubefirst-api/internal/aws" + "github.com/konstructio/kubefirst-api/internal/azure" "github.com/konstructio/kubefirst-api/internal/civo" cloudflare "github.com/konstructio/kubefirst-api/internal/cloudflare" "github.com/konstructio/kubefirst-api/internal/digitalocean" @@ -73,7 +74,7 @@ func PostDomains(c *gin.Context) { domains, err := client.ListDomains(context.Background(), &linodego.ListOptions{}) if err != nil { - c.JSON(http.StatusBadRequest, types.JSONFailureResponse{ + c.JSON(http.StatusInternalServerError, types.JSONFailureResponse{ Message: err.Error(), }) return @@ -119,6 +120,38 @@ func PostDomains(c *gin.Context) { return } domainListResponse.Domains = domains + + case "azure": + err = domainListRequest.AzureAuth.ValidateAuthCredentials() + if err != nil { + c.JSON(http.StatusBadRequest, types.JSONFailureResponse{ + Message: err.Error(), + }) + return + } + + azureClient, err := azure.NewClient( + domainListRequest.AzureAuth.ClientID, + domainListRequest.AzureAuth.ClientSecret, + domainListRequest.AzureAuth.SubscriptionID, + domainListRequest.AzureAuth.TenantID, + ) + if err != nil { + c.JSON(http.StatusInternalServerError, types.JSONFailureResponse{ + Message: err.Error(), + }) + return + } + + domains, err := azureClient.GetDNSDomains(context.Background(), domainListRequest.ResourceGroup) + if err != nil { + c.JSON(http.StatusInternalServerError, types.JSONFailureResponse{ + Message: err.Error(), + }) + return + } + + domainListResponse.Domains = domains case "cloudflare": // check for token, make sure it aint blank if domainListRequest.CloudflareAuth.APIToken == "" { @@ -130,7 +163,7 @@ func PostDomains(c *gin.Context) { client, err := cloudflare_api.NewWithAPIToken(domainListRequest.CloudflareAuth.APIToken) if err != nil { - c.JSON(http.StatusBadRequest, types.JSONFailureResponse{ + c.JSON(http.StatusInternalServerError, types.JSONFailureResponse{ Message: fmt.Sprintf("Could not create cloudflare client, %v", err), }) return @@ -143,7 +176,7 @@ func PostDomains(c *gin.Context) { domains, err := cloudflareConf.GetDNSDomains() if err != nil { - c.JSON(http.StatusBadRequest, types.JSONFailureResponse{ + c.JSON(http.StatusInternalServerError, types.JSONFailureResponse{ Message: err.Error(), }) return @@ -165,7 +198,7 @@ func PostDomains(c *gin.Context) { domains, err := civoConf.GetDNSDomains() if err != nil { - c.JSON(http.StatusBadRequest, types.JSONFailureResponse{ + c.JSON(http.StatusInternalServerError, types.JSONFailureResponse{ Message: err.Error(), }) return @@ -185,7 +218,7 @@ func PostDomains(c *gin.Context) { domains, err := digitaloceanConf.GetDNSDomains() if err != nil { - c.JSON(http.StatusBadRequest, types.JSONFailureResponse{ + c.JSON(http.StatusInternalServerError, types.JSONFailureResponse{ Message: err.Error(), }) return @@ -205,7 +238,7 @@ func PostDomains(c *gin.Context) { domains, err := vultrConf.GetDNSDomains() if err != nil { - c.JSON(http.StatusBadRequest, types.JSONFailureResponse{ + c.JSON(http.StatusInternalServerError, types.JSONFailureResponse{ Message: err.Error(), }) return @@ -228,7 +261,7 @@ func PostDomains(c *gin.Context) { domains, err := googleConf.GetDNSDomains() if err != nil { - c.JSON(http.StatusBadRequest, types.JSONFailureResponse{ + c.JSON(http.StatusInternalServerError, types.JSONFailureResponse{ Message: err.Error(), }) return diff --git a/internal/router/api/v1/resourceGroups.go b/internal/router/api/v1/resourceGroups.go new file mode 100644 index 00000000..dc802abe --- /dev/null +++ b/internal/router/api/v1/resourceGroups.go @@ -0,0 +1,57 @@ +package api + +import ( + "context" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/konstructio/kubefirst-api/internal/azure" + "github.com/konstructio/kubefirst-api/internal/types" +) + +// Currently only needs to support google +func ListResourceGroups(c *gin.Context) { + var resourceGroupsListRequest types.ResourceGroupsListRequest + err := c.Bind(&resourceGroupsListRequest) + if err != nil { + c.JSON(http.StatusBadRequest, types.JSONFailureResponse{ + Message: err.Error(), + }) + return + } + + err = resourceGroupsListRequest.AzureAuth.ValidateAuthCredentials() + if err != nil { + c.JSON(http.StatusBadRequest, types.JSONFailureResponse{ + Message: err.Error(), + }) + return + } + + azureClient, err := azure.NewClient( + resourceGroupsListRequest.AzureAuth.ClientID, + resourceGroupsListRequest.AzureAuth.ClientSecret, + resourceGroupsListRequest.AzureAuth.SubscriptionID, + resourceGroupsListRequest.AzureAuth.TenantID, + ) + if err != nil { + c.JSON(http.StatusBadRequest, types.JSONFailureResponse{ + Message: err.Error(), + }) + return + } + + var resourceGroupsListResponse types.ResourceGroupsListResponse + + resourceGroups, err := azureClient.GetResourceGroups(context.Background()) + if err != nil { + c.JSON(http.StatusBadRequest, types.JSONFailureResponse{ + Message: err.Error(), + }) + return + } + + resourceGroupsListResponse.ResourceGroups = resourceGroups + + c.JSON(http.StatusOK, resourceGroupsListResponse) +} diff --git a/internal/router/router.go b/internal/router/router.go index 1a5270a9..7ba0f8e8 100644 --- a/internal/router/router.go +++ b/internal/router/router.go @@ -86,6 +86,7 @@ func SetupRouter() *gin.Engine { // Zones *** Only supports google *** v1.POST("/zones", middleware.ValidateAPIKey(), router.ListZonesForRegion) + v1.POST("/resource-groups", middleware.ValidateAPIKey(), router.ListResourceGroups) // Instance Sizes v1.POST("/instance-sizes/:cloud_provider", middleware.ValidateAPIKey(), router.ListInstanceSizesForRegion) diff --git a/internal/types/domain.go b/internal/types/domain.go index 52bdb13b..c9849b6c 100644 --- a/internal/types/domain.go +++ b/internal/types/domain.go @@ -13,6 +13,7 @@ import ( // DomainListRequest type DomainListRequest struct { CloudRegion string `json:"cloud_region"` + ResourceGroup string `json:"resource_group"` AkamaiAuth pkgtypes.AkamaiAuth `json:"akamai_auth,omitempty"` AWSAuth pkgtypes.AWSAuth `json:"aws_auth,omitempty"` CivoAuth pkgtypes.CivoAuth `json:"civo_auth,omitempty"` @@ -20,6 +21,7 @@ type DomainListRequest struct { VultrAuth pkgtypes.VultrAuth `json:"vultr_auth,omitempty"` CloudflareAuth pkgtypes.CloudflareAuth `json:"cloudflare_auth,omitempty"` GoogleAuth pkgtypes.GoogleAuth `bson:"google_auth,omitempty" json:"google_auth,omitempty"` + AzureAuth pkgtypes.AzureAuth `bson:"azure_auth,omitempty" json:"azure_auth,omitempty"` } // DomainListResponse diff --git a/internal/types/resourceGroups.go b/internal/types/resourceGroups.go new file mode 100644 index 00000000..c55f3b73 --- /dev/null +++ b/internal/types/resourceGroups.go @@ -0,0 +1,13 @@ +package types + +import ( + pkgtypes "github.com/konstructio/kubefirst-api/pkg/types" +) + +type ResourceGroupsListRequest struct { + AzureAuth pkgtypes.AzureAuth `bson:"azure_auth,omitempty" json:"azure_auth,omitempty"` +} + +type ResourceGroupsListResponse struct { + ResourceGroups []string `json:"resource_groups"` +} diff --git a/pkg/types/auth.go b/pkg/types/auth.go index 221724ff..16f3dcb8 100644 --- a/pkg/types/auth.go +++ b/pkg/types/auth.go @@ -18,14 +18,6 @@ type AWSAuth struct { SessionToken string `bson:"session_token" json:"session_token"` } -// AzureAuth holds necessary auth credentials for interacting with azure -type AzureAuth struct { - ClientID string `bson:"client_id" json:"client_id"` - ClientSecret string `bson:"client_secret" json:"client_secret"` - TenantID string `bson:"tenant_id" json:"tenant_id"` - SubscriptionID string `bson:"subscription_id" json:"subscription_id"` -} - // CivoAuth holds necessary auth credentials for interacting with civo type CivoAuth struct { Token string `bson:"token" json:"token"` diff --git a/pkg/types/azure.go b/pkg/types/azure.go new file mode 100644 index 00000000..f843c73b --- /dev/null +++ b/pkg/types/azure.go @@ -0,0 +1,22 @@ +package types + +import "fmt" + +// AzureAuth holds necessary auth credentials for interacting with azure +type AzureAuth struct { + ClientID string `bson:"client_id" json:"client_id"` + ClientSecret string `bson:"client_secret" json:"client_secret"` + TenantID string `bson:"tenant_id" json:"tenant_id"` + SubscriptionID string `bson:"subscription_id" json:"subscription_id"` +} + +func (auth *AzureAuth) ValidateAuthCredentials() error { + if auth.ClientID == "" || + auth.ClientSecret == "" || + auth.SubscriptionID == "" || + auth.TenantID == "" { + return fmt.Errorf("missing authentication credentials in request, please check and try again") + } + + return nil +} diff --git a/providers/civo/create.go b/providers/civo/create.go index 46b35859..5d962a05 100644 --- a/providers/civo/create.go +++ b/providers/civo/create.go @@ -187,6 +187,7 @@ func CreateCivoCluster(definition *pkgtypes.ClusterDefinition) error { err = ctrl.WriteVaultSecrets() if err != nil { ctrl.UpdateClusterOnError(err.Error()) + return fmt.Errorf("error writing vault secrets: %w", err) }