github.com/nathanielks/terraform@v0.6.1-0.20170509030759-13e1a62319dc/builtin/providers/gitlab/resource_gitlab_project_hook.go (about)

     1  package gitlab
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"strconv"
     7  
     8  	"github.com/hashicorp/terraform/helper/schema"
     9  	gitlab "github.com/xanzy/go-gitlab"
    10  )
    11  
    12  func resourceGitlabProjectHook() *schema.Resource {
    13  	return &schema.Resource{
    14  		Create: resourceGitlabProjectHookCreate,
    15  		Read:   resourceGitlabProjectHookRead,
    16  		Update: resourceGitlabProjectHookUpdate,
    17  		Delete: resourceGitlabProjectHookDelete,
    18  
    19  		Schema: map[string]*schema.Schema{
    20  			"project": {
    21  				Type:     schema.TypeString,
    22  				Required: true,
    23  			},
    24  			"url": {
    25  				Type:     schema.TypeString,
    26  				Required: true,
    27  			},
    28  			"token": {
    29  				Type:      schema.TypeString,
    30  				Optional:  true,
    31  				Sensitive: true,
    32  			},
    33  			"push_events": {
    34  				Type:     schema.TypeBool,
    35  				Optional: true,
    36  				Default:  true,
    37  			},
    38  			"issues_events": {
    39  				Type:     schema.TypeBool,
    40  				Optional: true,
    41  				Default:  false,
    42  			},
    43  			"merge_requests_events": {
    44  				Type:     schema.TypeBool,
    45  				Optional: true,
    46  				Default:  false,
    47  			},
    48  			"tag_push_events": {
    49  				Type:     schema.TypeBool,
    50  				Optional: true,
    51  				Default:  false,
    52  			},
    53  			"note_events": {
    54  				Type:     schema.TypeBool,
    55  				Optional: true,
    56  				Default:  false,
    57  			},
    58  			"build_events": {
    59  				Type:     schema.TypeBool,
    60  				Optional: true,
    61  				Default:  false,
    62  			},
    63  			"pipeline_events": {
    64  				Type:     schema.TypeBool,
    65  				Optional: true,
    66  				Default:  false,
    67  			},
    68  			"wiki_page_events": {
    69  				Type:     schema.TypeBool,
    70  				Optional: true,
    71  				Default:  false,
    72  			},
    73  			"enable_ssl_verification": {
    74  				Type:     schema.TypeBool,
    75  				Optional: true,
    76  				Default:  true,
    77  			},
    78  		},
    79  	}
    80  }
    81  
    82  func resourceGitlabProjectHookCreate(d *schema.ResourceData, meta interface{}) error {
    83  	client := meta.(*gitlab.Client)
    84  	project := d.Get("project").(string)
    85  	options := &gitlab.AddProjectHookOptions{
    86  		URL:                   gitlab.String(d.Get("url").(string)),
    87  		PushEvents:            gitlab.Bool(d.Get("push_events").(bool)),
    88  		IssuesEvents:          gitlab.Bool(d.Get("issues_events").(bool)),
    89  		MergeRequestsEvents:   gitlab.Bool(d.Get("merge_requests_events").(bool)),
    90  		TagPushEvents:         gitlab.Bool(d.Get("tag_push_events").(bool)),
    91  		NoteEvents:            gitlab.Bool(d.Get("note_events").(bool)),
    92  		BuildEvents:           gitlab.Bool(d.Get("build_events").(bool)),
    93  		PipelineEvents:        gitlab.Bool(d.Get("pipeline_events").(bool)),
    94  		WikiPageEvents:        gitlab.Bool(d.Get("wiki_page_events").(bool)),
    95  		EnableSSLVerification: gitlab.Bool(d.Get("enable_ssl_verification").(bool)),
    96  	}
    97  
    98  	if v, ok := d.GetOk("token"); ok {
    99  		options.Token = gitlab.String(v.(string))
   100  	}
   101  
   102  	log.Printf("[DEBUG] create gitlab project hook %q", options.URL)
   103  
   104  	hook, _, err := client.Projects.AddProjectHook(project, options)
   105  	if err != nil {
   106  		return err
   107  	}
   108  
   109  	d.SetId(fmt.Sprintf("%d", hook.ID))
   110  
   111  	return resourceGitlabProjectHookRead(d, meta)
   112  }
   113  
   114  func resourceGitlabProjectHookRead(d *schema.ResourceData, meta interface{}) error {
   115  	client := meta.(*gitlab.Client)
   116  	project := d.Get("project").(string)
   117  	hookId, err := strconv.Atoi(d.Id())
   118  	if err != nil {
   119  		return err
   120  	}
   121  	log.Printf("[DEBUG] read gitlab project hook %s/%d", project, hookId)
   122  
   123  	hook, response, err := client.Projects.GetProjectHook(project, hookId)
   124  	if err != nil {
   125  		if response.StatusCode == 404 {
   126  			log.Printf("[WARN] removing project hook %d from state because it no longer exists in gitlab", hookId)
   127  			d.SetId("")
   128  			return nil
   129  		}
   130  
   131  		return err
   132  	}
   133  
   134  	d.Set("url", hook.URL)
   135  	d.Set("push_events", hook.PushEvents)
   136  	d.Set("issues_events", hook.IssuesEvents)
   137  	d.Set("merge_requests_events", hook.MergeRequestsEvents)
   138  	d.Set("tag_push_events", hook.TagPushEvents)
   139  	d.Set("note_events", hook.NoteEvents)
   140  	d.Set("build_events", hook.BuildEvents)
   141  	d.Set("pipeline_events", hook.PipelineEvents)
   142  	d.Set("wiki_page_events", hook.WikiPageEvents)
   143  	d.Set("enable_ssl_verification", hook.EnableSSLVerification)
   144  	return nil
   145  }
   146  
   147  func resourceGitlabProjectHookUpdate(d *schema.ResourceData, meta interface{}) error {
   148  	client := meta.(*gitlab.Client)
   149  	project := d.Get("project").(string)
   150  	hookId, err := strconv.Atoi(d.Id())
   151  	if err != nil {
   152  		return err
   153  	}
   154  	options := &gitlab.EditProjectHookOptions{
   155  		URL:                   gitlab.String(d.Get("url").(string)),
   156  		PushEvents:            gitlab.Bool(d.Get("push_events").(bool)),
   157  		IssuesEvents:          gitlab.Bool(d.Get("issues_events").(bool)),
   158  		MergeRequestsEvents:   gitlab.Bool(d.Get("merge_requests_events").(bool)),
   159  		TagPushEvents:         gitlab.Bool(d.Get("tag_push_events").(bool)),
   160  		NoteEvents:            gitlab.Bool(d.Get("note_events").(bool)),
   161  		BuildEvents:           gitlab.Bool(d.Get("build_events").(bool)),
   162  		PipelineEvents:        gitlab.Bool(d.Get("pipeline_events").(bool)),
   163  		WikiPageEvents:        gitlab.Bool(d.Get("wiki_page_events").(bool)),
   164  		EnableSSLVerification: gitlab.Bool(d.Get("enable_ssl_verification").(bool)),
   165  	}
   166  
   167  	if d.HasChange("token") {
   168  		options.Token = gitlab.String(d.Get("token").(string))
   169  	}
   170  
   171  	log.Printf("[DEBUG] update gitlab project hook %s", d.Id())
   172  
   173  	_, _, err = client.Projects.EditProjectHook(project, hookId, options)
   174  	if err != nil {
   175  		return err
   176  	}
   177  
   178  	return resourceGitlabProjectHookRead(d, meta)
   179  }
   180  
   181  func resourceGitlabProjectHookDelete(d *schema.ResourceData, meta interface{}) error {
   182  	client := meta.(*gitlab.Client)
   183  	project := d.Get("project").(string)
   184  	hookId, err := strconv.Atoi(d.Id())
   185  	if err != nil {
   186  		return err
   187  	}
   188  	log.Printf("[DEBUG] Delete gitlab project hook %s", d.Id())
   189  
   190  	_, err = client.Projects.DeleteProjectHook(project, hookId)
   191  	return err
   192  }