github.com/vtorhonen/terraform@v0.9.0-beta2.0.20170307220345-5d894e4ffda7/builtin/providers/bitbucket/resource_repository.go (about)

     1  package bitbucket
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/json"
     6  	"fmt"
     7  	"github.com/hashicorp/terraform/helper/schema"
     8  	"log"
     9  )
    10  
    11  type CloneUrl struct {
    12  	Href string `json:"href,omitempty"`
    13  	Name string `json:"name,omitempty"`
    14  }
    15  
    16  type Repository struct {
    17  	SCM         string `json:"scm,omitempty"`
    18  	HasWiki     bool   `json:"has_wiki,omitempty"`
    19  	HasIssues   bool   `json:"has_issues,omitempty"`
    20  	Website     string `json:"website,omitempty"`
    21  	IsPrivate   bool   `json:"is_private,omitempty"`
    22  	ForkPolicy  string `json:"fork_policy,omitempty"`
    23  	Language    string `json:"language,omitempty"`
    24  	Description string `json:"description,omitempty"`
    25  	Name        string `json:"name,omitempty"`
    26  	UUID        string `json:"uuid,omitempty"`
    27  	Project     struct {
    28  		Key string `json:"key,omitempty"`
    29  	} `json:"project,omitempty"`
    30  	Links struct {
    31  		Clone []CloneUrl `json:"clone,omitempty"`
    32  	} `json:"links,omitempty"`
    33  }
    34  
    35  func resourceRepository() *schema.Resource {
    36  	return &schema.Resource{
    37  		Create: resourceRepositoryCreate,
    38  		Update: resourceRepositoryUpdate,
    39  		Read:   resourceRepositoryRead,
    40  		Delete: resourceRepositoryDelete,
    41  		Importer: &schema.ResourceImporter{
    42  			State: schema.ImportStatePassthrough,
    43  		},
    44  
    45  		Schema: map[string]*schema.Schema{
    46  			"scm": &schema.Schema{
    47  				Type:     schema.TypeString,
    48  				Optional: true,
    49  				Default:  "git",
    50  			},
    51  			"has_wiki": &schema.Schema{
    52  				Type:     schema.TypeBool,
    53  				Optional: true,
    54  				Default:  false,
    55  			},
    56  			"has_issues": &schema.Schema{
    57  				Type:     schema.TypeBool,
    58  				Optional: true,
    59  				Default:  false,
    60  			},
    61  			"website": &schema.Schema{
    62  				Type:     schema.TypeString,
    63  				Optional: true,
    64  			},
    65  			"clone_ssh": &schema.Schema{
    66  				Type:     schema.TypeString,
    67  				Computed: true,
    68  			},
    69  			"clone_https": &schema.Schema{
    70  				Type:     schema.TypeString,
    71  				Computed: true,
    72  			},
    73  			"project_key": &schema.Schema{
    74  				Type:     schema.TypeString,
    75  				Optional: true,
    76  			},
    77  			"is_private": &schema.Schema{
    78  				Type:     schema.TypeBool,
    79  				Optional: true,
    80  				Default:  true,
    81  			},
    82  			"fork_policy": &schema.Schema{
    83  				Type:     schema.TypeString,
    84  				Optional: true,
    85  				Default:  "allow_forks",
    86  			},
    87  			"language": &schema.Schema{
    88  				Type:     schema.TypeString,
    89  				Optional: true,
    90  			},
    91  			"description": &schema.Schema{
    92  				Type:     schema.TypeString,
    93  				Optional: true,
    94  			},
    95  			"owner": &schema.Schema{
    96  				Type:     schema.TypeString,
    97  				Required: true,
    98  			},
    99  			"name": &schema.Schema{
   100  				Type:     schema.TypeString,
   101  				Required: true,
   102  			},
   103  		},
   104  	}
   105  }
   106  
   107  func newRepositoryFromResource(d *schema.ResourceData) *Repository {
   108  	repo := &Repository{
   109  		Name:        d.Get("name").(string),
   110  		Language:    d.Get("language").(string),
   111  		IsPrivate:   d.Get("is_private").(bool),
   112  		Description: d.Get("description").(string),
   113  		ForkPolicy:  d.Get("fork_policy").(string),
   114  		HasWiki:     d.Get("has_wiki").(bool),
   115  		HasIssues:   d.Get("has_issues").(bool),
   116  		SCM:         d.Get("scm").(string),
   117  		Website:     d.Get("website").(string),
   118  	}
   119  
   120  	repo.Project.Key = d.Get("project_key").(string)
   121  	return repo
   122  }
   123  
   124  func resourceRepositoryUpdate(d *schema.ResourceData, m interface{}) error {
   125  	client := m.(*BitbucketClient)
   126  	repository := newRepositoryFromResource(d)
   127  
   128  	var jsonbuffer []byte
   129  
   130  	jsonpayload := bytes.NewBuffer(jsonbuffer)
   131  	enc := json.NewEncoder(jsonpayload)
   132  	enc.Encode(repository)
   133  
   134  	repository_response, err := client.Put(fmt.Sprintf("2.0/repositories/%s/%s",
   135  		d.Get("owner").(string),
   136  		d.Get("name").(string),
   137  	), jsonpayload)
   138  
   139  	if err != nil {
   140  		return err
   141  	}
   142  
   143  	if repository_response.StatusCode == 200 {
   144  		decoder := json.NewDecoder(repository_response.Body)
   145  		err = decoder.Decode(&repository)
   146  		if err != nil {
   147  			return err
   148  		}
   149  	} else {
   150  		return fmt.Errorf("Failed to put: %d", repository_response.StatusCode)
   151  	}
   152  
   153  	return resourceRepositoryRead(d, m)
   154  }
   155  
   156  func resourceRepositoryCreate(d *schema.ResourceData, m interface{}) error {
   157  	client := m.(*BitbucketClient)
   158  	repo := newRepositoryFromResource(d)
   159  
   160  	var jsonbuffer []byte
   161  
   162  	jsonpayload := bytes.NewBuffer(jsonbuffer)
   163  	enc := json.NewEncoder(jsonpayload)
   164  	enc.Encode(repo)
   165  
   166  	log.Printf("Sending %s \n", jsonpayload)
   167  
   168  	repo_req, err := client.Post(fmt.Sprintf("2.0/repositories/%s/%s",
   169  		d.Get("owner").(string),
   170  		d.Get("name").(string),
   171  	), jsonpayload)
   172  
   173  	decoder := json.NewDecoder(repo_req.Body)
   174  	err = decoder.Decode(&repo)
   175  	if err != nil {
   176  		return err
   177  	}
   178  
   179  	log.Printf("Received %s \n", repo_req.Body)
   180  
   181  	if repo_req.StatusCode != 200 {
   182  		return fmt.Errorf("Failed to create repository got status code %d", repo_req.StatusCode)
   183  	}
   184  
   185  	d.SetId(string(fmt.Sprintf("%s/%s", d.Get("owner").(string), d.Get("name").(string))))
   186  
   187  	return resourceRepositoryRead(d, m)
   188  }
   189  func resourceRepositoryRead(d *schema.ResourceData, m interface{}) error {
   190  
   191  	client := m.(*BitbucketClient)
   192  	repo_req, err := client.Get(fmt.Sprintf("2.0/repositories/%s/%s",
   193  		d.Get("owner").(string),
   194  		d.Get("name").(string),
   195  	))
   196  
   197  	if err != nil {
   198  		return err
   199  	}
   200  
   201  	var repo Repository
   202  
   203  	decoder := json.NewDecoder(repo_req.Body)
   204  	err = decoder.Decode(&repo)
   205  	if err != nil {
   206  		return err
   207  	}
   208  
   209  	d.Set("scm", repo.SCM)
   210  	d.Set("is_private", repo.IsPrivate)
   211  	d.Set("has_wiki", repo.HasWiki)
   212  	d.Set("has_issues", repo.HasIssues)
   213  	d.Set("name", repo.Name)
   214  	d.Set("language", repo.Language)
   215  	d.Set("fork_policy", repo.ForkPolicy)
   216  	d.Set("website", repo.Website)
   217  	d.Set("description", repo.Description)
   218  	d.Set("project_key", repo.Project.Key)
   219  
   220  	for _, clone_url := range repo.Links.Clone {
   221  		if clone_url.Name == "https" {
   222  			d.Set("clone_https", clone_url.Href)
   223  		} else {
   224  			d.Set("clone_ssh", clone_url.Href)
   225  		}
   226  	}
   227  
   228  	return nil
   229  }
   230  
   231  func resourceRepositoryDelete(d *schema.ResourceData, m interface{}) error {
   232  	client := m.(*BitbucketClient)
   233  	delete_response, err := client.Delete(fmt.Sprintf("2.0/repositories/%s/%s",
   234  		d.Get("owner").(string),
   235  		d.Get("name").(string),
   236  	))
   237  
   238  	if err != nil {
   239  		return err
   240  	}
   241  
   242  	if delete_response.StatusCode != 204 {
   243  		return fmt.Errorf("Failed to delete the repository got status code %d", delete_response.StatusCode)
   244  	}
   245  
   246  	return nil
   247  }