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 }