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  }