github.com/aws-cloudformation/cloudformation-cli-go-plugin@v1.2.0/examples/github-repo/cmd/resource/resource.go (about)

     1  package resource
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"log"
     7  	"strings"
     8  
     9  	"github.com/aws-cloudformation/cloudformation-cli-go-plugin/cfn/handler"
    10  	"github.com/aws/aws-sdk-go/aws"
    11  	"github.com/google/go-github/github"
    12  	"golang.org/x/oauth2"
    13  )
    14  
    15  func makeGitHubClient(token string) *github.Client {
    16  	ts := oauth2.StaticTokenSource(
    17  		&oauth2.Token{AccessToken: token},
    18  	)
    19  
    20  	tc := oauth2.NewClient(context.Background(), ts)
    21  
    22  	return github.NewClient(tc)
    23  }
    24  
    25  func parseURL(url string) (string, string) {
    26  	parts := strings.Split(url, "/")
    27  
    28  	return parts[len(parts)-2], parts[len(parts)-1]
    29  }
    30  
    31  // Create handles the Create event from the Cloudformation service.
    32  func Create(req handler.Request, prevModel *Model, currentModel *Model) (handler.ProgressEvent, error) {
    33  	client := makeGitHubClient(*currentModel.OauthToken)
    34  
    35  	log.Printf("Attempting to create repository: %s/%s", *currentModel.Owner, *currentModel.Name)
    36  
    37  	repo, resp, err := client.Repositories.Create(context.Background(), "", &github.Repository{
    38  		Name:        currentModel.Name,
    39  		Homepage:    currentModel.Homepage,
    40  		Description: currentModel.Description,
    41  		Owner: &github.User{
    42  			Name: currentModel.Owner,
    43  		},
    44  	})
    45  
    46  	if err != nil {
    47  		return handler.ProgressEvent{}, err
    48  	}
    49  
    50  	if resp.StatusCode != 201 {
    51  		log.Printf("Got a non-201 error code: %v", resp.Status)
    52  		return handler.ProgressEvent{}, fmt.Errorf("Status Code: %d, Status: %v", resp.StatusCode, resp.Status)
    53  	}
    54  
    55  	currentModel.URL = aws.String(repo.GetURL())
    56  
    57  	return handler.ProgressEvent{
    58  		OperationStatus: handler.Success,
    59  		Message:         "Create Complete",
    60  		ResourceModel:   currentModel,
    61  	}, nil
    62  }
    63  
    64  // Read handles the Read event from the Cloudformation service.
    65  func Read(req handler.Request, prevModel *Model, currentModel *Model) (handler.ProgressEvent, error) {
    66  	owner, repoName := parseURL(*currentModel.URL)
    67  
    68  	log.Printf("Looking for repository: %s/%s", *currentModel.Owner, *currentModel.Name)
    69  	client := makeGitHubClient(*currentModel.OauthToken)
    70  	repo, resp, err := client.Repositories.Get(context.Background(), owner, repoName)
    71  	if err != nil {
    72  		return handler.ProgressEvent{}, err
    73  	}
    74  
    75  	if resp.StatusCode != 200 {
    76  		log.Printf("Unable to find repository: %s", resp.Status)
    77  		return handler.ProgressEvent{}, fmt.Errorf("Status Code: %d, Status: %v", resp.StatusCode, resp.Status)
    78  	}
    79  
    80  	currentModel.Name = repo.Name
    81  	currentModel.Owner = repo.Owner.Name
    82  	currentModel.Description = repo.Description
    83  	currentModel.Homepage = repo.Homepage
    84  
    85  	return handler.ProgressEvent{
    86  		OperationStatus: handler.Success,
    87  		Message:         "Read Complete",
    88  		ResourceModel:   currentModel,
    89  	}, nil
    90  }
    91  
    92  // Update handles the Update event from the Cloudformation service.
    93  func Update(req handler.Request, prevModel *Model, currentModel *Model) (handler.ProgressEvent, error) {
    94  	owner, repoName := parseURL(*currentModel.URL)
    95  
    96  	log.Printf("Looking for repository: %s/%s", *currentModel.Owner, *currentModel.Name)
    97  	client := makeGitHubClient(*currentModel.OauthToken)
    98  
    99  	_, resp, err := client.Repositories.Edit(context.Background(), owner, repoName, &github.Repository{
   100  		Homepage:    currentModel.Homepage,
   101  		Description: currentModel.Description,
   102  	})
   103  	if err != nil {
   104  		return handler.ProgressEvent{}, err
   105  	}
   106  
   107  	if resp.StatusCode != 200 {
   108  		log.Printf("Unable to find repository: %s", resp.Status)
   109  		return handler.ProgressEvent{}, fmt.Errorf("Status Code: %d, Status: %v", resp.StatusCode, resp.Status)
   110  	}
   111  
   112  	return handler.ProgressEvent{
   113  		OperationStatus: handler.Success,
   114  		Message:         "Update Complete",
   115  		ResourceModel:   currentModel,
   116  	}, nil
   117  }
   118  
   119  // Delete handles the Delete event from the Cloudformation service.
   120  func Delete(req handler.Request, prevModel *Model, currentModel *Model) (handler.ProgressEvent, error) {
   121  	owner, repoName := parseURL(*currentModel.URL)
   122  
   123  	log.Printf("Looking for repository: %s/%s", *currentModel.Owner, *currentModel.Name)
   124  	client := makeGitHubClient(*currentModel.OauthToken)
   125  
   126  	resp, err := client.Repositories.Delete(context.Background(), owner, repoName)
   127  	if err != nil {
   128  		return handler.ProgressEvent{}, err
   129  	}
   130  
   131  	if resp.StatusCode != 200 {
   132  		log.Printf("Unable to find repository: %s", resp.Status)
   133  		return handler.ProgressEvent{}, fmt.Errorf("Status Code: %d, Status: %v", resp.StatusCode, resp.Status)
   134  	}
   135  
   136  	return handler.ProgressEvent{
   137  		OperationStatus: handler.Success,
   138  		Message:         "Delete Complete",
   139  		ResourceModel:   currentModel,
   140  	}, nil
   141  }
   142  
   143  // List handles the List event from the Cloudformation service.
   144  func List(req handler.Request, prevModel *Model, currentModel *Model) (handler.ProgressEvent, error) {
   145  	return handler.ProgressEvent{
   146  		OperationStatus: handler.Success,
   147  		Message:         "List Complete",
   148  		ResourceModel:   currentModel,
   149  	}, nil
   150  }