From d4cbf2245099a61e9f83dc13eb054e78378fd791 Mon Sep 17 00:00:00 2001 From: Alex Ott Date: Thu, 12 Aug 2021 09:39:25 +0200 Subject: [PATCH] Add exporting of repos --- exporter/importables.go | 55 +++++++++++++++++++++++- workspace/resource_repo.go | 30 +++++++++++++ workspace/resource_repo_test.go | 74 +++++++++++++++++++++++++++++++++ 3 files changed, 158 insertions(+), 1 deletion(-) diff --git a/exporter/importables.go b/exporter/importables.go index 9a253132af..470f9d923b 100644 --- a/exporter/importables.go +++ b/exporter/importables.go @@ -817,7 +817,7 @@ var resourcesMap map[string]importable = map[string]importable{ Resource: "databricks_global_init_script", ID: gis.ScriptID, }) - log.Printf("[INFO] Scanned %d of %d clusters", offset+1, len(globalInitScripts)) + log.Printf("[INFO] Scanned %d of %d global init scripts", offset+1, len(globalInitScripts)) } return nil }, @@ -856,4 +856,57 @@ var resourcesMap map[string]importable = map[string]importable{ return nil }, }, + "databricks_repo": { + Service: "repos", + Name: func(d *schema.ResourceData) string { + name := d.Get("path").(string) + if name == "" { + return d.Id() + } else { + name = strings.TrimPrefix(name, "/") + } + re := regexp.MustCompile(`[^0-9A-Za-z_]`) + return re.ReplaceAllString(name, "_") + }, + List: func(ic *importContext) error { + repoList, err := workspace.NewReposAPI(ic.Context, ic.Client).ListAll() + if err != nil { + return err + } + for offset, repo := range repoList { + if repo.Url != "" { + ic.Emit(&resource{ + Resource: "databricks_repo", + ID: fmt.Sprintf("%d", repo.Id), + }) + } + log.Printf("[INFO] Scanned %d of %d repos", offset+1, len(repoList)) + } + return nil + }, + Import: func(ic *importContext, r *resource) error { + if ic.meAdmin { + ic.Emit(&resource{ + Resource: "databricks_permissions", + ID: fmt.Sprintf("/repos/%s", r.ID), + Name: ic.Importables["databricks_repo"].Name(r.Data), + }) + } + return nil + }, + Body: func(ic *importContext, body *hclwrite.Body, r *resource) error { + b := body.AppendNewBlock("resource", []string{r.Resource, r.Name}).Body() + b.SetAttributeValue("url", cty.StringVal(r.Data.Get("url").(string))) + b.SetAttributeValue("git_provider", cty.StringVal(r.Data.Get("git_provider").(string))) + t := r.Data.Get("branch").(string) + if t != "" { + b.SetAttributeValue("branch", cty.StringVal(t)) + } + t = r.Data.Get("path").(string) + if t != "" { + b.SetAttributeValue("path", cty.StringVal(t)) + } + return nil + }, + }, } diff --git a/workspace/resource_repo.go b/workspace/resource_repo.go index 84abd2f741..251d70e5e3 100644 --- a/workspace/resource_repo.go +++ b/workspace/resource_repo.go @@ -57,6 +57,36 @@ func (a ReposAPI) Read(id string) (ReposResponse, error) { return resp, err } +type reposListResponse struct { + NextPageToken string `json:"next_page_token,omitempty"` + Repos []ReposResponse `json:"repos"` +} + +func (a ReposAPI) List(prefix string) ([]ReposResponse, error) { + req := map[string]string{} + if prefix != "" { + req["path_prefix"] = prefix + } + reposList := []ReposResponse{} + for { + var resp reposListResponse + err := a.client.Get(a.context, "/repos", req, &resp) + if err != nil { + return nil, err + } + reposList = append(reposList, resp.Repos...) + if resp.NextPageToken == "" { + break + } + req["next_page_token"] = resp.NextPageToken + } + return reposList, nil +} + +func (a ReposAPI) ListAll() ([]ReposResponse, error) { + return a.List("") +} + var gitProvidersMap = map[string]string{ "github.com": "gitHub", "dev.azure.com": "azureDevOpsServices", diff --git a/workspace/resource_repo_test.go b/workspace/resource_repo_test.go index a4441f036f..9b3d46c7e7 100644 --- a/workspace/resource_repo_test.go +++ b/workspace/resource_repo_test.go @@ -1,11 +1,13 @@ package workspace import ( + "context" "fmt" "net/http" "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/databrickslabs/terraform-provider-databricks/common" @@ -329,3 +331,75 @@ func TestResourceReposUpdateSwitchToBranch(t *testing.T) { assert.NoError(t, err, err) assert.Equal(t, "releases", d.Get("branch")) } + +func TestReposListAll(t *testing.T) { + resp := ReposResponse{ + Id: 121232342, + Url: "https://github.com/user/test.git", + Provider: "gitHub", + Path: "/Repos/user@domain/test", + HeadCommitId: "1124323423abc23424", + Branch: "releases", + } + + client, server, err := qa.HttpFixtureClient(t, []qa.HTTPFixture{ + { + Method: "GET", + Resource: "/api/2.0/repos?", + Response: reposListResponse{ + NextPageToken: "12312423442343242343", + Repos: []ReposResponse{ + resp, + }, + }, + }, + { + Method: "GET", + Resource: "/api/2.0/repos?next_page_token=12312423442343242343", + Response: reposListResponse{ + Repos: []ReposResponse{ + resp, + }, + }, + }, + }) + defer server.Close() + require.NoError(t, err) + + ctx := context.Background() + reposList, err := NewReposAPI(ctx, client).ListAll() + require.NoError(t, err) + assert.Equal(t, len(reposList), 2) + assert.Equal(t, resp.Branch, reposList[1].Branch) +} + +func TestReposListWithPrefix(t *testing.T) { + resp := ReposResponse{ + Id: 121232342, + Url: "https://github.com/user/test.git", + Provider: "gitHub", + Path: "/Repos/user@domain/test", + HeadCommitId: "1124323423abc23424", + Branch: "releases", + } + + client, server, err := qa.HttpFixtureClient(t, []qa.HTTPFixture{ + { + Method: "GET", + Resource: "/api/2.0/repos?path_prefix=%2FRepos%2Fabc", + Response: reposListResponse{ + Repos: []ReposResponse{ + resp, + }, + }, + }, + }) + defer server.Close() + require.NoError(t, err) + + ctx := context.Background() + reposList, err := NewReposAPI(ctx, client).List("/Repos/abc") + require.NoError(t, err) + assert.Equal(t, len(reposList), 1) + assert.Equal(t, resp.Branch, reposList[0].Branch) +}