Skip to content

Commit

Permalink
add ability to enable admin rights for user (#4)
Browse files Browse the repository at this point in the history
  • Loading branch information
timjonesdev committed Sep 2, 2020
1 parent e6b7164 commit 8195149
Show file tree
Hide file tree
Showing 8 changed files with 62 additions and 21 deletions.
4 changes: 3 additions & 1 deletion cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ var (
templateProjectName string
templateProjectTemplateName string
templateRepoJenkinsUrl string
userID string
templateRepoCreateWebhook bool
)

Expand Down Expand Up @@ -68,7 +69,7 @@ func Orchestrator(cmd *cobra.Command, args []string) {

targetRepo := git_client.NewBitBucketRepoConfig(targetRepoProjectKey, targetRepoSlug, targetRepoFunctionalDomain, targetRepoProjectName)

repoUrl, err := orchestrator.GenerateFromTemplateAndCommit(templateProjectName, templateProjectTemplateName, templateRepoJenkinsUrl, optionsMap, targetRepo, templateRepoCreateWebhook)
repoUrl, err := orchestrator.GenerateFromTemplateAndCommit(userID, templateProjectName, templateProjectTemplateName, templateRepoJenkinsUrl, optionsMap, targetRepo, templateRepoCreateWebhook)

if err != nil {
fmt.Printf("error occurred: %+v\n", err)
Expand All @@ -92,6 +93,7 @@ func init() {
rootCmd.Flags().StringVar(&templateProjectTemplateName, "templateName", "", "The name of the Template to generate")
rootCmd.Flags().StringVar(&templateRepoJenkinsUrl, "templateRepoJenkinsUrl", "", "The Jenkins URL for webhook configuration")
rootCmd.Flags().BoolVar(&templateRepoCreateWebhook, "templateRepoCreateWebhook", false, "Flag to generate webhook or not")
rootCmd.Flags().StringVar(&userID, "userID", "", "The user ID of the person creating a project")
// Here you will define your flags and configuration settings.
// Cobra supports persistent flags, which, if defined here,
// will be global for your application.
Expand Down
2 changes: 1 addition & 1 deletion config.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
bitbucket_url: "changeme"
bitbucket_user: "changeme"
bitbucket_user_email: "changeme"
bitbucket_timeout: 1
bitbucket_timeout: 15
bitbucket_password: "changeme"
github_user: "changeme"
github_password: "changeme"
Expand Down
5 changes: 1 addition & 4 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
module github.com/att-cloudnative-labs/template-api

go 1.12
go 1.14

require (
github.com/BurntSushi/toml v0.3.1 // indirect
github.com/go-chi/chi v4.0.2+incompatible
github.com/go-chi/cors v1.0.0
github.com/go-chi/render v1.0.1
github.com/inconshreveable/mousetrap v1.0.0 // indirect
github.com/mitchellh/go-homedir v1.1.0
github.com/pkg/errors v0.8.0
Expand Down
6 changes: 0 additions & 6 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,6 @@ github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/gliderlabs/ssh v0.1.1 h1:j3L6gSLQalDETeEg/Jg0mGY0/y/N6zI2xX1978P0Uqw=
github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
github.com/go-chi/chi v4.0.2+incompatible h1:maB6vn6FqCxrpz4FqWdh4+lwpyZIQS7YEAUcHlgXVRs=
github.com/go-chi/chi v4.0.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ=
github.com/go-chi/cors v1.0.0 h1:e6x8k7uWbUwYs+aXDoiUzeQFT6l0cygBYyNhD7/1Tg0=
github.com/go-chi/cors v1.0.0/go.mod h1:K2Yje0VW/SJzxiyMYu6iPQYa7hMjQX2i/F491VChg1I=
github.com/go-chi/render v1.0.1 h1:4/5tis2cKaNdnv9zFLfXzcquC9HbeZgCnxGnKrltBS8=
github.com/go-chi/render v1.0.1/go.mod h1:pq4Rr7HbnsdaeHagklXub+p6Wd16Af5l9koip1OvJns=
github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
Expand Down
40 changes: 38 additions & 2 deletions pkg/genesis/git_client/bitbucket_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ type BitBucketWebHookRequest struct {
CommittersToIgnore string `json:"committersToIgnore"`
BranchesToIgnore string `json:"branchesToIgnore"`
Enabled bool `json:"enabled"`
TagCreated bool `json:"tagCreated"`
}

// REST API URL:
Expand Down Expand Up @@ -110,8 +111,8 @@ func NewBitBucketClientConfig(gitHost, username, password, email, accessToken st
authenticationToken = base64.StdEncoding.EncodeToString([]byte(username + ":" + accessToken))
}

if timeout < 0 || timeout > 10 {
return BitBucketClientConfig{}, errors.Errorf("timeout must be set between 1 and 10")
if timeout < 0 || timeout > 15 {
return BitBucketClientConfig{}, errors.Errorf("timeout must be set between 1 and 15")
}

return BitBucketClientConfig{
Expand Down Expand Up @@ -174,6 +175,7 @@ func (gitClient *BitBucketClient) CreateWebhook(url string, gitConfig GitRepoCon
CommittersToIgnore: "",
BranchesToIgnore: "",
Enabled: true,
TagCreated: true,
}
jsonValue, err := json.Marshal(payload)

Expand Down Expand Up @@ -455,6 +457,40 @@ func (gitClient *BitBucketClient) CheckoutTag(tagName string, gitRepoConfig GitR
return directory, nil
}

func (gitClient *BitBucketClient) AddAdminRights(userID string, gitRepoConfig GitRepoConfig) error {
apiUrl := gitRepoConfig.ConstructRestApiUrl(gitClient.Config.GitHost)
apiPermissionsUrl := fmt.Sprintf("%s/%s/permissions/users", apiUrl, gitRepoConfig.GetRepoName())

request, _ := http.NewRequest("PUT", apiPermissionsUrl, bytes.NewBuffer([]byte("")))
request.Header.Set("Authorization", "Basic "+gitClient.Config.AuthenticationToken)
q := request.URL.Query()
q.Add("name", userID)
q.Add("permission", "REPO_ADMIN")

request.URL.RawQuery = q.Encode()

response, err := gitClient.RestClient.Do(request)

if response != nil {
defer func() {
if err := response.Body.Close(); err != nil {
fmt.Printf("error closing response body %+v\n", err)
}
}()
}

if err != nil {
return errors.Wrapf(err, "unable to apply admin rights for user %s", userID)
}

code := response.StatusCode

if code != http.StatusOK && code != http.StatusNoContent {
return errors.New("there was a problem granting admin rights for user " + userID)
}
return nil
}

func getTempDirectoryAndRepoUrl(gitClient *BitBucketClient, gitRepoConfig GitRepoConfig) (directoryPath, repoUrl string, err error) {
exists, err := gitClient.RepoExists(gitRepoConfig)
if err != nil {
Expand Down
2 changes: 2 additions & 0 deletions pkg/genesis/git_client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ type GitClient interface {
CreateWebhook(url string, gitConfig GitRepoConfig) error
// ListAllReposForProjectKey queries the BitBucket REST API to retrieve a list of repository names, or an error
ListAllReposForProjectKey(projectKey string) ([]string, error)
// AddAdminRights adds the given userID to the list of admins for a repository
AddAdminRights(userID string, gitRepoConfig GitRepoConfig) error
}

// Defines behavior for a set of git repo configuration
Expand Down
4 changes: 4 additions & 0 deletions pkg/genesis/git_client/github_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -249,3 +249,7 @@ func (client *GitHubClient) RepoExists(gitRepoConfig GitRepoConfig) (exists bool
func (client *GitHubClient) CreateWebhook(url string, gitConfig GitRepoConfig) error {
panic("implement me")
}

func (client *GitHubClient) AddAdminRights(userID string, gitRepoConfig GitRepoConfig) error {
panic("implement me")
}
20 changes: 13 additions & 7 deletions pkg/genesis/orchestrator.go
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ func (templateOrchestrator *TemplateOrchestrator) GetListOfRepositoriesForProjec

// Pulls a template repository, performs variable replacement, and commits new project to targetRepo
// Template and Target repositories can be from different Git Hosts (eg. Template in BitBucket and Target in GitHub)
func (templateOrchestrator *TemplateOrchestrator) GenerateFromTemplateAndCommit(templateKey, templateName, jenkinsUrl string, optionsMap map[string]string, targetRepo git_client.GitRepoConfig, createWebhook bool) (repoUrl string, err error) {
func (templateOrchestrator *TemplateOrchestrator) GenerateFromTemplateAndCommit(userID, templateKey, templateName, jenkinsUrl string, optionsMap map[string]string, targetRepo git_client.GitRepoConfig, createWebhook bool) (repoUrl string, err error) {

targetGitClient, templateGitClient, templateRepoConfig, err := templateOrchestrator.getTargetClient(templateKey, targetRepo)

Expand All @@ -176,11 +176,11 @@ func (templateOrchestrator *TemplateOrchestrator) GenerateFromTemplateAndCommit(
return "", err
}

return templateOrchestrator.processTemplate(dirName, templateName, jenkinsUrl, optionsMap, targetGitClient, targetRepo, createWebhook)
return templateOrchestrator.processTemplate(userID, dirName, templateName, jenkinsUrl, optionsMap, targetGitClient, targetRepo, createWebhook)
}

// Orchestrate a repository clone for a specific branch
func (templateOrchestrator *TemplateOrchestrator) GenerateFromTemplateBranchAndCommit(templateKey, templateName, branchName, jenkinsUrl string, optionsMap map[string]string, targetRepo git_client.GitRepoConfig, createWebhook bool) (repoUrl string, err error) {
func (templateOrchestrator *TemplateOrchestrator) GenerateFromTemplateBranchAndCommit(userID, templateKey, templateName, branchName, jenkinsUrl string, optionsMap map[string]string, targetRepo git_client.GitRepoConfig, createWebhook bool) (repoUrl string, err error) {

targetGitClient, templateGitClient, templateRepoConfig, err := templateOrchestrator.getTargetClient(templateKey, targetRepo)

Expand All @@ -194,11 +194,11 @@ func (templateOrchestrator *TemplateOrchestrator) GenerateFromTemplateBranchAndC
return "", err
}

return templateOrchestrator.processTemplate(dirName, templateName, jenkinsUrl, optionsMap, targetGitClient, targetRepo, createWebhook)
return templateOrchestrator.processTemplate(userID, dirName, templateName, jenkinsUrl, optionsMap, targetGitClient, targetRepo, createWebhook)
}

// Orchestrate a repository clone for a specific tag
func (templateOrchestrator *TemplateOrchestrator) GenerateFromTemplateTagAndCommit(templateKey, templateName, tagName, jenkinsUrl string, optionsMap map[string]string, targetRepo git_client.GitRepoConfig, createWebhook bool) (repoUrl string, err error) {
func (templateOrchestrator *TemplateOrchestrator) GenerateFromTemplateTagAndCommit(userID, templateKey, templateName, tagName, jenkinsUrl string, optionsMap map[string]string, targetRepo git_client.GitRepoConfig, createWebhook bool) (repoUrl string, err error) {

targetGitClient, templateGitClient, templateRepoConfig, err := templateOrchestrator.getTargetClient(templateKey, targetRepo)

Expand All @@ -212,7 +212,7 @@ func (templateOrchestrator *TemplateOrchestrator) GenerateFromTemplateTagAndComm
return "", err
}

return templateOrchestrator.processTemplate(dirName, templateName, jenkinsUrl, optionsMap, targetGitClient, targetRepo, createWebhook)
return templateOrchestrator.processTemplate(userID, dirName, templateName, jenkinsUrl, optionsMap, targetGitClient, targetRepo, createWebhook)
}

func (templateOrchestrator *TemplateOrchestrator) getTargetClient(templateKey string, targetRepo git_client.GitRepoConfig) (targetGitClient git_client.GitClient, templateGitClient git_client.GitClient, templateRepoConfig git_client.GitRepoConfig, err error) {
Expand Down Expand Up @@ -249,7 +249,7 @@ func (templateOrchestrator *TemplateOrchestrator) getTargetClient(templateKey st
return targetGitClient, templateGitClient, templateRepoConfig, nil
}

func (templateOrchestrator *TemplateOrchestrator) processTemplate(dirName, templateName, jenkinsUrl string, optionsMap map[string]string, targetGitClient git_client.GitClient, targetRepo git_client.GitRepoConfig, createWebhook bool) (repoUrl string, err error) {
func (templateOrchestrator *TemplateOrchestrator) processTemplate(userID, dirName, templateName, jenkinsUrl string, optionsMap map[string]string, targetGitClient git_client.GitClient, targetRepo git_client.GitRepoConfig, createWebhook bool) (repoUrl string, err error) {

genesisTemplateApi := template.NewGenesisTemplateApi(dirName)

Expand All @@ -276,6 +276,12 @@ func (templateOrchestrator *TemplateOrchestrator) processTemplate(dirName, templ
return "", err
}

err = targetGitClient.AddAdminRights(userID, targetRepo)

if err != nil {
fmt.Printf("failed to add admin rights, but moving on. Err: %+v", err)
}

err = targetGitClient.InitialCommitProjectToRepo(dirName+"/"+root, targetRepo)
if err != nil {
return "", err
Expand Down

0 comments on commit 8195149

Please sign in to comment.