M mailman/domain.go => mailman/domain.go +7 -0
@@ 17,3 17,10 @@ func (client *Client) GetDomain(mailHost string) (*Domain, error) {
return domain, nil
}
+
+func (client *Client) NewDomain(domain *Domain) error {
+
+ err := client.post("/domains", domain)
+
+ return err
+}
M mailman/mailman_client.go => mailman/mailman_client.go +40 -9
@@ 1,6 1,7 @@
package mailman
import (
+ "bytes"
"encoding/json"
"fmt"
"io/ioutil"
@@ 46,26 47,56 @@ func (client *Client) get(path string, resource interface{}) error {
return nil
}
- req.SetBasicAuth(client.credentials.Username, client.credentials.Password)
- resp, err := client.httpClient.Do(req)
+ responseBody, err := client.sendRequest(req)
if err != nil {
return err
}
- defer resp.Body.Close()
- if resp.StatusCode > 400 {
- return fmt.Errorf("API error code: %d", resp.StatusCode)
+ err = json.Unmarshal(responseBody, &resource)
+ if err != nil {
+ return err
}
- responseBody, err := ioutil.ReadAll(resp.Body)
+ return nil
+}
+
+func (client *Client) post(path string, requestBody interface{}) error {
+ resourceURL := client.baseURL + path
+
+ payload, err := json.Marshal(requestBody)
if err != nil {
return err
}
- err = json.Unmarshal(responseBody, &resource)
+ req, err := http.NewRequest(http.MethodPost, resourceURL, bytes.NewBuffer(payload))
if err != nil {
- return err
+ return nil
}
- return nil
+ req.Header.Add("Content-Type", "application/json")
+
+ _, err = client.sendRequest(req)
+
+ return err
+}
+
+func (client *Client) sendRequest(req *http.Request) ([]byte, error) {
+ req.SetBasicAuth(client.credentials.Username, client.credentials.Password)
+
+ resp, err := client.httpClient.Do(req)
+ if err != nil {
+ return nil, err
+ }
+ defer resp.Body.Close()
+
+ if resp.StatusCode > 400 {
+ return nil, fmt.Errorf("API error code: %d", resp.StatusCode)
+ }
+
+ responseBody, err := ioutil.ReadAll(resp.Body)
+ if err != nil {
+ return nil, err
+ }
+
+ return responseBody, nil
}
M provider/provider.go => provider/provider.go +3 -1
@@ 29,7 29,9 @@ func MailmanProvider() *schema.Provider {
DefaultFunc: schema.EnvDefaultFunc("MAILMAN_URL", nil),
},
},
- ResourcesMap: map[string]*schema.Resource{},
+ ResourcesMap: map[string]*schema.Resource{
+ "mailman_domain": resourceMailmanDomain(),
+ },
DataSourcesMap: map[string]*schema.Resource{
"mailman_domain": dataSourceMailmanDomain(),
},
M provider/resource_mailman_domain.go => provider/resource_mailman_domain.go +63 -0
@@ 5,6 5,69 @@ import (
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
+func resourceMailmanDomain() *schema.Resource {
+ return &schema.Resource{
+ Create: resourceMailmanDomainCreate,
+ Read: resourceMailmanDomainRead,
+ Update: resourceMailmanDomainUpdate,
+ Delete: resourceMailmanDomainDelete,
+ Schema: map[string]*schema.Schema{
+ "mail_host": {
+ Type: schema.TypeString,
+ Required: true,
+ },
+ "alias_domain": {
+ Type: schema.TypeString,
+ Optional: true,
+ },
+ "description": {
+ Type: schema.TypeString,
+ Optional: true,
+ },
+ },
+ }
+}
+
+func resourceMailmanDomainCreate(data *schema.ResourceData, meta interface{}) error {
+ client := meta.(*mailman.Client)
+
+ domain := &mailman.Domain{
+ MailHost: data.Get("mail_host").(string),
+ AliasDomain: data.Get("alias_domain").(string),
+ Description: data.Get("description").(string),
+ }
+
+ err := client.NewDomain(domain)
+ if err != nil {
+ return err
+ }
+
+ setDomainData(data, domain)
+
+ return resourceMailmanDomainRead(data, meta)
+}
+
+func resourceMailmanDomainRead(data *schema.ResourceData, meta interface{}) error {
+ client := meta.(*mailman.Client)
+
+ domain, err := client.GetDomain(data.Id())
+ if err != nil {
+ return err
+ }
+
+ setDomainData(data, domain)
+
+ return nil
+}
+
+func resourceMailmanDomainUpdate(data *schema.ResourceData, meta interface{}) error {
+ return nil
+}
+
+func resourceMailmanDomainDelete(data *schema.ResourceData, meta interface{}) error {
+ return nil
+}
+
func setDomainData(data *schema.ResourceData, domain *mailman.Domain) {
data.SetId(domain.MailHost)