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 }