![[OSSCA] Terraform Provider 개발(3) - Go API 패키지 만들기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqm0Bp%2FbtsIP0cqX9E%2FD3fHriMuXAF2xOSJJltIw1%2Fimg.webp)
GO API를 Terraform에 연결하기 이전, Terraform에서 API를 쉽게 호출할 수 있는 라이브러리를 만들어보고자 한다.
https://github.com/hashicorp-demoapp/hashicups-client-go
GitHub - hashicorp-demoapp/hashicups-client-go: Simple Go Client for HashiCups
Simple Go Client for HashiCups. Contribute to hashicorp-demoapp/hashicups-client-go development by creating an account on GitHub.
github.com
원본 client 패키지는 여기서 볼 수 있다.
https://github.com/inpyu/hashicups-client-go?tab=readme-ov-file
GitHub - inpyu/hashicups-client-go: [OSSCA] Terraform Provider 개발을 위한 Cafe package client 개발
[OSSCA] Terraform Provider 개발을 위한 Cafe package client 개발 - inpyu/hashicups-client-go
github.com
내가 개발한 패키지는 여기서 볼 수 있다.
Cafe.go
GetCafes
func (c *Client) GetCafes() ([]Cafe, error) {
req, err := http.NewRequest("GET", fmt.Sprintf("%s/cafes", c.HostURL), nil)
if err != nil {
return nil, err
}
body, err := c.doRequest(req, nil)
if err != nil {
return nil, err
}
cafes := []Cafe{}
err = json.Unmarshal(body, &cafes)
if err != nil {
return nil, err
}
return cafes, nil
}
cafes의 URL을 받은 뒤, request를 req에 담는다. 또한 해당 내용을 body에 넣은 뒤 json을 파싱하여 반환하는 간단한 라이브러리를 작성한다.
GetCafe
func (c *Client) GetCafe(cafeID string) ([]Cafe, error) {
req, err := http.NewRequest("GET", fmt.Sprintf("%s/cafes/%s", c.HostURL, cafeID), nil)
if err != nil {
return nil, err
}
body, err := c.doRequest(req, nil)
if err != nil {
return nil, err
}
cafes := []Cafe{}
err = json.Unmarshal(body, &cafes)
if err != nil {
return nil, err
}
return cafes, nil
}
해당 함수의 경우 Cafes와 달리 단일객체로 구성되었다. 사실 이전에 필요없을줄 알고 만들지 않았다가 Cafe를 한개씩 가져올 상황이 Terraform Provider를 개발하는 도중에 생겨 도중에 추가하게 되었다. 마찬가지로 URL을 받은 뒤 반환값을 cafes에 넣어서 반환하자.
CreateCafe
func (c *Client) CreateCafe(cafes []Cafe) (*Cafe, error) {
rb, err := json.Marshal(cafes)
if err != nil {
return nil, err
}
req, err := http.NewRequest("POST", fmt.Sprintf("%s/cafes", c.HostURL), strings.NewReader(string(rb)))
if err != nil {
return nil, err
}
body, err := c.doRequest(req, nil)
if err != nil {
return nil, err
}
cafe := Cafe{}
err = json.Unmarshal(body, &cafe)
if err != nil {
return nil, err
}
return &cafe, nil
}
UpdateCafe
func (c *Client) UpdateCafe(cafeID string, cafes []Cafe) (*Cafe, error) {
rb, err := json.Marshal(cafes)
if err != nil {
return nil, err
}
req, err := http.NewRequest("PUT", fmt.Sprintf("%s/cafes/%s", c.HostURL, cafeID), strings.NewReader(string(rb)))
if err != nil {
return nil, err
}
body, err := c.doRequest(req, nil)
if err != nil {
return nil, err
}
cafe := Cafe{}
err = json.Unmarshal(body, &cafe)
if err != nil {
return nil, err
}
return &cafe, nil
}
DeleteCafe
func (c *Client) DeleteCafe(cafeID string) error {
req, err := http.NewRequest("DELETE", fmt.Sprintf("%s/cafes/%s", c.HostURL, cafeID), nil)
if err != nil {
return err
}
body, err := c.doRequest(req, nil)
if err != nil {
return err
}
if string(body) != "Deleted cafe" {
return errors.New(string(body))
}
return nil
}
위의 메서드들 모두 같은 동작을 하기 때문에 설명은 생략하고자 한다.
'Infra > Terraform' 카테고리의 다른 글
[OSSCA] Terraform Provider 개발(4) - Custom Provider 만들기 (0) | 2024.07.31 |
---|---|
[OSSCA] Terraform Provider 개발(2) - Go API 제작하기 (0) | 2024.07.30 |
[OSSCA] Terraform Provider 개발(1) - Go API 분석하기 (0) | 2024.07.29 |
[OSSCA] Terraform Provider SDK 와 Framework 버전 차이를 알아보자 (1) | 2024.07.24 |
[OSSCA] Terraform Provider 살펴보기 (2) | 2024.07.23 |
보안 전공 개발자지만 대학로에서 살고 싶어요
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!