github.com/nathanielks/terraform@v0.6.1-0.20170509030759-13e1a62319dc/builtin/providers/gitlab/resource_gitlab_project.go (about) 1 package gitlab 2 3 import ( 4 "fmt" 5 "log" 6 7 "github.com/hashicorp/terraform/helper/schema" 8 "github.com/hashicorp/terraform/helper/validation" 9 gitlab "github.com/xanzy/go-gitlab" 10 ) 11 12 func resourceGitlabProject() *schema.Resource { 13 return &schema.Resource{ 14 Create: resourceGitlabProjectCreate, 15 Read: resourceGitlabProjectRead, 16 Update: resourceGitlabProjectUpdate, 17 Delete: resourceGitlabProjectDelete, 18 19 Schema: map[string]*schema.Schema{ 20 "name": { 21 Type: schema.TypeString, 22 Required: true, 23 }, 24 "description": { 25 Type: schema.TypeString, 26 Optional: true, 27 }, 28 "default_branch": { 29 Type: schema.TypeString, 30 Optional: true, 31 }, 32 "issues_enabled": { 33 Type: schema.TypeBool, 34 Optional: true, 35 Default: true, 36 }, 37 "merge_requests_enabled": { 38 Type: schema.TypeBool, 39 Optional: true, 40 Default: true, 41 }, 42 "wiki_enabled": { 43 Type: schema.TypeBool, 44 Optional: true, 45 Default: true, 46 }, 47 "snippets_enabled": { 48 Type: schema.TypeBool, 49 Optional: true, 50 Default: true, 51 }, 52 "visibility_level": { 53 Type: schema.TypeString, 54 Optional: true, 55 ValidateFunc: validation.StringInSlice([]string{"private", "internal", "public"}, true), 56 Default: "private", 57 }, 58 59 "ssh_url_to_repo": { 60 Type: schema.TypeString, 61 Computed: true, 62 }, 63 "http_url_to_repo": { 64 Type: schema.TypeString, 65 Computed: true, 66 }, 67 "web_url": { 68 Type: schema.TypeString, 69 Computed: true, 70 }, 71 }, 72 } 73 } 74 75 func resourceGitlabProjectSetToState(d *schema.ResourceData, project *gitlab.Project) { 76 d.Set("name", project.Name) 77 d.Set("description", project.Description) 78 d.Set("default_branch", project.DefaultBranch) 79 d.Set("issues_enabled", project.IssuesEnabled) 80 d.Set("merge_requests_enabled", project.MergeRequestsEnabled) 81 d.Set("wiki_enabled", project.WikiEnabled) 82 d.Set("snippets_enabled", project.SnippetsEnabled) 83 d.Set("visibility_level", visibilityLevelToString(project.VisibilityLevel)) 84 85 d.Set("ssh_url_to_repo", project.SSHURLToRepo) 86 d.Set("http_url_to_repo", project.HTTPURLToRepo) 87 d.Set("web_url", project.WebURL) 88 } 89 90 func resourceGitlabProjectCreate(d *schema.ResourceData, meta interface{}) error { 91 client := meta.(*gitlab.Client) 92 options := &gitlab.CreateProjectOptions{ 93 Name: gitlab.String(d.Get("name").(string)), 94 IssuesEnabled: gitlab.Bool(d.Get("issues_enabled").(bool)), 95 MergeRequestsEnabled: gitlab.Bool(d.Get("merge_requests_enabled").(bool)), 96 WikiEnabled: gitlab.Bool(d.Get("wiki_enabled").(bool)), 97 SnippetsEnabled: gitlab.Bool(d.Get("snippets_enabled").(bool)), 98 } 99 100 if v, ok := d.GetOk("description"); ok { 101 options.Description = gitlab.String(v.(string)) 102 } 103 104 if v, ok := d.GetOk("visibility_level"); ok { 105 options.VisibilityLevel = stringToVisibilityLevel(v.(string)) 106 } 107 108 log.Printf("[DEBUG] create gitlab project %q", options.Name) 109 110 project, _, err := client.Projects.CreateProject(options) 111 if err != nil { 112 return err 113 } 114 115 d.SetId(fmt.Sprintf("%d", project.ID)) 116 117 return resourceGitlabProjectRead(d, meta) 118 } 119 120 func resourceGitlabProjectRead(d *schema.ResourceData, meta interface{}) error { 121 client := meta.(*gitlab.Client) 122 log.Printf("[DEBUG] read gitlab project %s", d.Id()) 123 124 project, response, err := client.Projects.GetProject(d.Id()) 125 if err != nil { 126 if response.StatusCode == 404 { 127 log.Printf("[WARN] removing project %s from state because it no longer exists in gitlab", d.Id()) 128 d.SetId("") 129 return nil 130 } 131 132 return err 133 } 134 135 resourceGitlabProjectSetToState(d, project) 136 return nil 137 } 138 139 func resourceGitlabProjectUpdate(d *schema.ResourceData, meta interface{}) error { 140 client := meta.(*gitlab.Client) 141 142 options := &gitlab.EditProjectOptions{} 143 144 if d.HasChange("name") { 145 options.Name = gitlab.String(d.Get("name").(string)) 146 } 147 148 if d.HasChange("description") { 149 options.Description = gitlab.String(d.Get("description").(string)) 150 } 151 152 if d.HasChange("default_branch") { 153 options.DefaultBranch = gitlab.String(d.Get("description").(string)) 154 } 155 156 if d.HasChange("visibility_level") { 157 options.VisibilityLevel = stringToVisibilityLevel(d.Get("visibility_level").(string)) 158 } 159 160 if d.HasChange("issues_enabled") { 161 options.IssuesEnabled = gitlab.Bool(d.Get("issues_enabled").(bool)) 162 } 163 164 if d.HasChange("merge_requests_enabled") { 165 options.MergeRequestsEnabled = gitlab.Bool(d.Get("merge_requests_enabled").(bool)) 166 } 167 168 if d.HasChange("wiki_enabled") { 169 options.WikiEnabled = gitlab.Bool(d.Get("wiki_enabled").(bool)) 170 } 171 172 if d.HasChange("snippets_enabled") { 173 options.SnippetsEnabled = gitlab.Bool(d.Get("snippets_enabled").(bool)) 174 } 175 176 log.Printf("[DEBUG] update gitlab project %s", d.Id()) 177 178 _, _, err := client.Projects.EditProject(d.Id(), options) 179 if err != nil { 180 return err 181 } 182 183 return resourceGitlabProjectRead(d, meta) 184 } 185 186 func resourceGitlabProjectDelete(d *schema.ResourceData, meta interface{}) error { 187 client := meta.(*gitlab.Client) 188 log.Printf("[DEBUG] Delete gitlab project %s", d.Id()) 189 190 _, err := client.Projects.DeleteProject(d.Id()) 191 return err 192 }