github.com/ezbercih/terraform@v0.1.1-0.20140729011846-3c33865e0839/rpc/resource_provisioner.go (about)

     1  package rpc
     2  
     3  import (
     4  	"net/rpc"
     5  
     6  	"github.com/hashicorp/terraform/terraform"
     7  )
     8  
     9  // ResourceProvisioner is an implementation of terraform.ResourceProvisioner
    10  // that communicates over RPC.
    11  type ResourceProvisioner struct {
    12  	Client *rpc.Client
    13  	Name   string
    14  }
    15  
    16  func (p *ResourceProvisioner) Validate(c *terraform.ResourceConfig) ([]string, []error) {
    17  	var resp ResourceProvisionerValidateResponse
    18  	args := ResourceProvisionerValidateArgs{
    19  		Config: c,
    20  	}
    21  
    22  	err := p.Client.Call(p.Name+".Validate", &args, &resp)
    23  	if err != nil {
    24  		return nil, []error{err}
    25  	}
    26  
    27  	var errs []error
    28  	if len(resp.Errors) > 0 {
    29  		errs = make([]error, len(resp.Errors))
    30  		for i, err := range resp.Errors {
    31  			errs[i] = err
    32  		}
    33  	}
    34  
    35  	return resp.Warnings, errs
    36  }
    37  
    38  func (p *ResourceProvisioner) Apply(
    39  	s *terraform.ResourceState,
    40  	c *terraform.ResourceConfig) error {
    41  	var resp ResourceProvisionerApplyResponse
    42  	args := &ResourceProvisionerApplyArgs{
    43  		State:  s,
    44  		Config: c,
    45  	}
    46  
    47  	err := p.Client.Call(p.Name+".Apply", args, &resp)
    48  	if err != nil {
    49  		return err
    50  	}
    51  	if resp.Error != nil {
    52  		err = resp.Error
    53  	}
    54  
    55  	return err
    56  }
    57  
    58  type ResourceProvisionerValidateArgs struct {
    59  	Config *terraform.ResourceConfig
    60  }
    61  
    62  type ResourceProvisionerValidateResponse struct {
    63  	Warnings []string
    64  	Errors   []*BasicError
    65  }
    66  
    67  type ResourceProvisionerApplyArgs struct {
    68  	State  *terraform.ResourceState
    69  	Config *terraform.ResourceConfig
    70  }
    71  
    72  type ResourceProvisionerApplyResponse struct {
    73  	Error *BasicError
    74  }
    75  
    76  // ResourceProvisionerServer is a net/rpc compatible structure for serving
    77  // a ResourceProvisioner. This should not be used directly.
    78  type ResourceProvisionerServer struct {
    79  	Provisioner terraform.ResourceProvisioner
    80  }
    81  
    82  func (s *ResourceProvisionerServer) Apply(
    83  	args *ResourceProvisionerApplyArgs,
    84  	result *ResourceProvisionerApplyResponse) error {
    85  	err := s.Provisioner.Apply(args.State, args.Config)
    86  	*result = ResourceProvisionerApplyResponse{
    87  		Error: NewBasicError(err),
    88  	}
    89  	return nil
    90  }
    91  
    92  func (s *ResourceProvisionerServer) Validate(
    93  	args *ResourceProvisionerValidateArgs,
    94  	reply *ResourceProvisionerValidateResponse) error {
    95  	warns, errs := s.Provisioner.Validate(args.Config)
    96  	berrs := make([]*BasicError, len(errs))
    97  	for i, err := range errs {
    98  		berrs[i] = NewBasicError(err)
    99  	}
   100  	*reply = ResourceProvisionerValidateResponse{
   101  		Warnings: warns,
   102  		Errors:   berrs,
   103  	}
   104  	return nil
   105  }