github.com/ezbercih/terraform@v0.1.1-0.20140729011846-3c33865e0839/rpc/resource_provider.go (about) 1 package rpc 2 3 import ( 4 "net/rpc" 5 6 "github.com/hashicorp/terraform/terraform" 7 ) 8 9 // ResourceProvider is an implementation of terraform.ResourceProvider 10 // that communicates over RPC. 11 type ResourceProvider struct { 12 Client *rpc.Client 13 Name string 14 } 15 16 func (p *ResourceProvider) Validate(c *terraform.ResourceConfig) ([]string, []error) { 17 var resp ResourceProviderValidateResponse 18 args := ResourceProviderValidateArgs{ 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 *ResourceProvider) ValidateResource( 39 t string, c *terraform.ResourceConfig) ([]string, []error) { 40 var resp ResourceProviderValidateResourceResponse 41 args := ResourceProviderValidateResourceArgs{ 42 Config: c, 43 Type: t, 44 } 45 46 err := p.Client.Call(p.Name+".ValidateResource", &args, &resp) 47 if err != nil { 48 return nil, []error{err} 49 } 50 51 var errs []error 52 if len(resp.Errors) > 0 { 53 errs = make([]error, len(resp.Errors)) 54 for i, err := range resp.Errors { 55 errs[i] = err 56 } 57 } 58 59 return resp.Warnings, errs 60 } 61 62 func (p *ResourceProvider) Configure(c *terraform.ResourceConfig) error { 63 var resp ResourceProviderConfigureResponse 64 err := p.Client.Call(p.Name+".Configure", c, &resp) 65 if err != nil { 66 return err 67 } 68 if resp.Error != nil { 69 err = resp.Error 70 } 71 72 return err 73 } 74 75 func (p *ResourceProvider) Apply( 76 s *terraform.ResourceState, 77 d *terraform.ResourceDiff) (*terraform.ResourceState, error) { 78 var resp ResourceProviderApplyResponse 79 args := &ResourceProviderApplyArgs{ 80 State: s, 81 Diff: d, 82 } 83 84 err := p.Client.Call(p.Name+".Apply", args, &resp) 85 if err != nil { 86 return nil, err 87 } 88 if resp.Error != nil { 89 err = resp.Error 90 } 91 92 return resp.State, err 93 } 94 95 func (p *ResourceProvider) Diff( 96 s *terraform.ResourceState, 97 c *terraform.ResourceConfig) (*terraform.ResourceDiff, error) { 98 var resp ResourceProviderDiffResponse 99 args := &ResourceProviderDiffArgs{ 100 State: s, 101 Config: c, 102 } 103 err := p.Client.Call(p.Name+".Diff", args, &resp) 104 if err != nil { 105 return nil, err 106 } 107 if resp.Error != nil { 108 err = resp.Error 109 } 110 111 return resp.Diff, err 112 } 113 114 func (p *ResourceProvider) Refresh( 115 s *terraform.ResourceState) (*terraform.ResourceState, error) { 116 var resp ResourceProviderRefreshResponse 117 err := p.Client.Call(p.Name+".Refresh", s, &resp) 118 if err != nil { 119 return nil, err 120 } 121 if resp.Error != nil { 122 err = resp.Error 123 } 124 125 return resp.State, err 126 } 127 128 func (p *ResourceProvider) Resources() []terraform.ResourceType { 129 var result []terraform.ResourceType 130 131 err := p.Client.Call(p.Name+".Resources", new(interface{}), &result) 132 if err != nil { 133 // TODO: panic, log, what? 134 return nil 135 } 136 137 return result 138 } 139 140 // ResourceProviderServer is a net/rpc compatible structure for serving 141 // a ResourceProvider. This should not be used directly. 142 type ResourceProviderServer struct { 143 Provider terraform.ResourceProvider 144 } 145 146 type ResourceProviderConfigureResponse struct { 147 Error *BasicError 148 } 149 150 type ResourceProviderApplyArgs struct { 151 State *terraform.ResourceState 152 Diff *terraform.ResourceDiff 153 } 154 155 type ResourceProviderApplyResponse struct { 156 State *terraform.ResourceState 157 Error *BasicError 158 } 159 160 type ResourceProviderDiffArgs struct { 161 State *terraform.ResourceState 162 Config *terraform.ResourceConfig 163 } 164 165 type ResourceProviderDiffResponse struct { 166 Diff *terraform.ResourceDiff 167 Error *BasicError 168 } 169 170 type ResourceProviderRefreshResponse struct { 171 State *terraform.ResourceState 172 Error *BasicError 173 } 174 175 type ResourceProviderValidateArgs struct { 176 Config *terraform.ResourceConfig 177 } 178 179 type ResourceProviderValidateResponse struct { 180 Warnings []string 181 Errors []*BasicError 182 } 183 184 type ResourceProviderValidateResourceArgs struct { 185 Config *terraform.ResourceConfig 186 Type string 187 } 188 189 type ResourceProviderValidateResourceResponse struct { 190 Warnings []string 191 Errors []*BasicError 192 } 193 194 func (s *ResourceProviderServer) Validate( 195 args *ResourceProviderValidateArgs, 196 reply *ResourceProviderValidateResponse) error { 197 warns, errs := s.Provider.Validate(args.Config) 198 berrs := make([]*BasicError, len(errs)) 199 for i, err := range errs { 200 berrs[i] = NewBasicError(err) 201 } 202 *reply = ResourceProviderValidateResponse{ 203 Warnings: warns, 204 Errors: berrs, 205 } 206 return nil 207 } 208 209 func (s *ResourceProviderServer) ValidateResource( 210 args *ResourceProviderValidateResourceArgs, 211 reply *ResourceProviderValidateResourceResponse) error { 212 warns, errs := s.Provider.ValidateResource(args.Type, args.Config) 213 berrs := make([]*BasicError, len(errs)) 214 for i, err := range errs { 215 berrs[i] = NewBasicError(err) 216 } 217 *reply = ResourceProviderValidateResourceResponse{ 218 Warnings: warns, 219 Errors: berrs, 220 } 221 return nil 222 } 223 224 func (s *ResourceProviderServer) Configure( 225 config *terraform.ResourceConfig, 226 reply *ResourceProviderConfigureResponse) error { 227 err := s.Provider.Configure(config) 228 *reply = ResourceProviderConfigureResponse{ 229 Error: NewBasicError(err), 230 } 231 return nil 232 } 233 234 func (s *ResourceProviderServer) Apply( 235 args *ResourceProviderApplyArgs, 236 result *ResourceProviderApplyResponse) error { 237 state, err := s.Provider.Apply(args.State, args.Diff) 238 *result = ResourceProviderApplyResponse{ 239 State: state, 240 Error: NewBasicError(err), 241 } 242 return nil 243 } 244 245 func (s *ResourceProviderServer) Diff( 246 args *ResourceProviderDiffArgs, 247 result *ResourceProviderDiffResponse) error { 248 diff, err := s.Provider.Diff(args.State, args.Config) 249 *result = ResourceProviderDiffResponse{ 250 Diff: diff, 251 Error: NewBasicError(err), 252 } 253 return nil 254 } 255 256 func (s *ResourceProviderServer) Refresh( 257 state *terraform.ResourceState, 258 result *ResourceProviderRefreshResponse) error { 259 newState, err := s.Provider.Refresh(state) 260 *result = ResourceProviderRefreshResponse{ 261 State: newState, 262 Error: NewBasicError(err), 263 } 264 return nil 265 } 266 267 func (s *ResourceProviderServer) Resources( 268 nothing interface{}, 269 result *[]terraform.ResourceType) error { 270 *result = s.Provider.Resources() 271 return nil 272 }