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