github.com/dahs81/otto@v0.2.1-0.20160126165905-6400716cf085/rpc/app.go (about)

     1  package rpc
     2  
     3  import (
     4  	"net/rpc"
     5  
     6  	"github.com/hashicorp/otto/app"
     7  	"github.com/hashicorp/otto/appfile"
     8  )
     9  
    10  // App is an implementation of app.App that communicates over RPC.
    11  type App struct {
    12  	Broker *muxBroker
    13  	Client *rpc.Client
    14  	Name   string
    15  }
    16  
    17  func (c *App) Meta() (*app.Meta, error) {
    18  	var resp AppMetaResponse
    19  
    20  	err := c.Client.Call(c.Name+".Meta", new(struct{}), &resp)
    21  	if err != nil {
    22  		return nil, err
    23  	}
    24  	if resp.Error != nil {
    25  		err = resp.Error
    26  		return nil, err
    27  	}
    28  
    29  	return resp.Result, nil
    30  }
    31  
    32  func (c *App) Implicit(ctx *app.Context) (*appfile.File, error) {
    33  	var resp AppImplicitResponse
    34  	args := AppContextArgs{Context: ctx}
    35  
    36  	// Serve the shared context data
    37  	serveContext(c.Broker, &ctx.Shared, &args.ContextSharedArgs)
    38  
    39  	// Call
    40  	err := c.Client.Call(c.Name+".Implicit", &args, &resp)
    41  	if err != nil {
    42  		return nil, err
    43  	}
    44  	if resp.Error != nil {
    45  		err = resp.Error
    46  		return nil, err
    47  	}
    48  
    49  	return resp.Result, nil
    50  }
    51  
    52  func (c *App) Compile(ctx *app.Context) (*app.CompileResult, error) {
    53  	var resp AppCompileResponse
    54  	args := AppContextArgs{Context: ctx}
    55  
    56  	// Serve the shared context data
    57  	serveContext(c.Broker, &ctx.Shared, &args.ContextSharedArgs)
    58  
    59  	// Call
    60  	err := c.Client.Call(c.Name+".Compile", &args, &resp)
    61  	if err != nil {
    62  		return nil, err
    63  	}
    64  	if resp.Error != nil {
    65  		err = resp.Error
    66  		return nil, err
    67  	}
    68  
    69  	return resp.Result, nil
    70  }
    71  
    72  func (c *App) Build(ctx *app.Context) error {
    73  	var resp AppSimpleResponse
    74  	args := AppContextArgs{Context: ctx}
    75  
    76  	// Serve the shared context data
    77  	serveContext(c.Broker, &ctx.Shared, &args.ContextSharedArgs)
    78  
    79  	// Call
    80  	err := c.Client.Call(c.Name+".Build", &args, &resp)
    81  	if err == nil {
    82  		if resp.Error != nil {
    83  			err = resp.Error
    84  		}
    85  	}
    86  
    87  	return err
    88  }
    89  
    90  func (c *App) Deploy(ctx *app.Context) error {
    91  	var resp AppSimpleResponse
    92  	args := AppContextArgs{Context: ctx}
    93  
    94  	// Serve the shared context data
    95  	serveContext(c.Broker, &ctx.Shared, &args.ContextSharedArgs)
    96  
    97  	// Call
    98  	err := c.Client.Call(c.Name+".Deploy", &args, &resp)
    99  	if err == nil {
   100  		if resp.Error != nil {
   101  			err = resp.Error
   102  		}
   103  	}
   104  
   105  	return err
   106  }
   107  
   108  func (c *App) Dev(ctx *app.Context) error {
   109  	var resp AppSimpleResponse
   110  	args := AppContextArgs{Context: ctx}
   111  
   112  	// Serve the shared context data
   113  	serveContext(c.Broker, &ctx.Shared, &args.ContextSharedArgs)
   114  
   115  	// Call
   116  	err := c.Client.Call(c.Name+".Dev", &args, &resp)
   117  	if err == nil {
   118  		if resp.Error != nil {
   119  			err = resp.Error
   120  		}
   121  	}
   122  
   123  	return err
   124  }
   125  
   126  func (c *App) DevDep(dst, src *app.Context) (*app.DevDep, error) {
   127  	var resp AppDevDepResponse
   128  	args := AppDevDepArgs{
   129  		ContextDst: dst,
   130  		ContextSrc: src,
   131  	}
   132  
   133  	// Serve the shared context data
   134  	serveContext(c.Broker, &dst.Shared, &args.ContextDstShared)
   135  	serveContext(c.Broker, &src.Shared, &args.ContextSrcShared)
   136  
   137  	// Call
   138  	err := c.Client.Call(c.Name+".DevDep", &args, &resp)
   139  	if err == nil && resp.Error != nil {
   140  		err = resp.Error
   141  	}
   142  	if err != nil {
   143  		return nil, err
   144  	}
   145  
   146  	return resp.Result, nil
   147  }
   148  
   149  func (c *App) Close() error {
   150  	return c.Client.Close()
   151  }
   152  
   153  // AppServer is a net/rpc compatible structure for serving an App.
   154  // This should not be used directly.
   155  type AppServer struct {
   156  	Broker *muxBroker
   157  	App    app.App
   158  }
   159  
   160  type AppContextArgs struct {
   161  	ContextSharedArgs
   162  
   163  	Context *app.Context
   164  }
   165  
   166  type AppMetaResponse struct {
   167  	Result *app.Meta
   168  	Error  *BasicError
   169  }
   170  
   171  type AppCompileResponse struct {
   172  	Result *app.CompileResult
   173  	Error  *BasicError
   174  }
   175  
   176  type AppImplicitResponse struct {
   177  	Result *appfile.File
   178  	Error  *BasicError
   179  }
   180  
   181  type AppDevDepArgs struct {
   182  	ContextDst       *app.Context
   183  	ContextDstShared ContextSharedArgs
   184  	ContextSrc       *app.Context
   185  	ContextSrcShared ContextSharedArgs
   186  }
   187  
   188  type AppDevDepResponse struct {
   189  	Result *app.DevDep
   190  	Error  *BasicError
   191  }
   192  
   193  type AppSimpleResponse struct {
   194  	Error *BasicError
   195  }
   196  
   197  func (s *AppServer) Meta(
   198  	args *struct{},
   199  	reply *AppMetaResponse) error {
   200  	result, err := s.App.Meta()
   201  	*reply = AppMetaResponse{
   202  		Result: result,
   203  		Error:  NewBasicError(err),
   204  	}
   205  
   206  	return nil
   207  }
   208  
   209  func (s *AppServer) Implicit(
   210  	args *AppContextArgs,
   211  	reply *AppImplicitResponse) error {
   212  	closer, err := connectContext(s.Broker, &args.Context.Shared, &args.ContextSharedArgs)
   213  	defer closer.Close()
   214  	if err != nil {
   215  		*reply = AppImplicitResponse{
   216  			Error: NewBasicError(err),
   217  		}
   218  
   219  		return nil
   220  	}
   221  
   222  	result, err := s.App.Implicit(args.Context)
   223  	*reply = AppImplicitResponse{
   224  		Result: result,
   225  		Error:  NewBasicError(err),
   226  	}
   227  
   228  	return nil
   229  }
   230  
   231  func (s *AppServer) Compile(
   232  	args *AppContextArgs,
   233  	reply *AppCompileResponse) error {
   234  	closer, err := connectContext(s.Broker, &args.Context.Shared, &args.ContextSharedArgs)
   235  	defer closer.Close()
   236  	if err != nil {
   237  		*reply = AppCompileResponse{
   238  			Error: NewBasicError(err),
   239  		}
   240  
   241  		return nil
   242  	}
   243  
   244  	result, err := s.App.Compile(args.Context)
   245  	*reply = AppCompileResponse{
   246  		Result: result,
   247  		Error:  NewBasicError(err),
   248  	}
   249  
   250  	return nil
   251  }
   252  
   253  func (s *AppServer) Build(
   254  	args *AppContextArgs,
   255  	reply *AppSimpleResponse) error {
   256  	closer, err := connectContext(s.Broker, &args.Context.Shared, &args.ContextSharedArgs)
   257  	defer closer.Close()
   258  	if err != nil {
   259  		*reply = AppSimpleResponse{
   260  			Error: NewBasicError(err),
   261  		}
   262  
   263  		return nil
   264  	}
   265  
   266  	*reply = AppSimpleResponse{
   267  		Error: NewBasicError(s.App.Build(args.Context)),
   268  	}
   269  
   270  	return nil
   271  }
   272  
   273  func (s *AppServer) Deploy(
   274  	args *AppContextArgs,
   275  	reply *AppSimpleResponse) error {
   276  	closer, err := connectContext(s.Broker, &args.Context.Shared, &args.ContextSharedArgs)
   277  	defer closer.Close()
   278  	if err != nil {
   279  		*reply = AppSimpleResponse{
   280  			Error: NewBasicError(err),
   281  		}
   282  
   283  		return nil
   284  	}
   285  
   286  	*reply = AppSimpleResponse{
   287  		Error: NewBasicError(s.App.Deploy(args.Context)),
   288  	}
   289  
   290  	return nil
   291  }
   292  
   293  func (s *AppServer) Dev(
   294  	args *AppContextArgs,
   295  	reply *AppSimpleResponse) error {
   296  	closer, err := connectContext(s.Broker, &args.Context.Shared, &args.ContextSharedArgs)
   297  	defer closer.Close()
   298  	if err != nil {
   299  		*reply = AppSimpleResponse{
   300  			Error: NewBasicError(err),
   301  		}
   302  
   303  		return nil
   304  	}
   305  
   306  	*reply = AppSimpleResponse{
   307  		Error: NewBasicError(s.App.Dev(args.Context)),
   308  	}
   309  
   310  	return nil
   311  }
   312  
   313  func (s *AppServer) DevDep(
   314  	args *AppDevDepArgs,
   315  	reply *AppDevDepResponse) error {
   316  	// Dst
   317  	closer, err := connectContext(s.Broker, &args.ContextDst.Shared, &args.ContextDstShared)
   318  	defer closer.Close()
   319  	if err != nil {
   320  		*reply = AppDevDepResponse{
   321  			Error: NewBasicError(err),
   322  		}
   323  
   324  		return nil
   325  	}
   326  
   327  	// Src
   328  	closer, err = connectContext(s.Broker, &args.ContextSrc.Shared, &args.ContextSrcShared)
   329  	defer closer.Close()
   330  	if err != nil {
   331  		*reply = AppDevDepResponse{
   332  			Error: NewBasicError(err),
   333  		}
   334  
   335  		return nil
   336  	}
   337  
   338  	result, err := s.App.DevDep(args.ContextDst, args.ContextSrc)
   339  	*reply = AppDevDepResponse{
   340  		Result: result,
   341  		Error:  NewBasicError(err),
   342  	}
   343  
   344  	return nil
   345  }