github.com/altoros/juju-vmware@v0.0.0-20150312064031-f19ae857ccca/apiserver/backups/backups.go (about)

     1  // Copyright 2014 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package backups
     5  
     6  import (
     7  	"io"
     8  
     9  	"github.com/juju/errors"
    10  	"github.com/juju/loggo"
    11  
    12  	"github.com/juju/juju/apiserver/common"
    13  	"github.com/juju/juju/apiserver/params"
    14  	"github.com/juju/juju/state"
    15  	"github.com/juju/juju/state/backups"
    16  )
    17  
    18  func init() {
    19  	common.RegisterStandardFacade("Backups", 0, NewAPI)
    20  }
    21  
    22  var logger = loggo.GetLogger("juju.apiserver.backups")
    23  
    24  // API serves backup-specific API methods.
    25  type API struct {
    26  	st    *state.State
    27  	paths *backups.Paths
    28  
    29  	// machineID is the ID of the machine where the API server is running.
    30  	machineID string
    31  }
    32  
    33  // NewAPI creates a new instance of the Backups API facade.
    34  func NewAPI(st *state.State, resources *common.Resources, authorizer common.Authorizer) (*API, error) {
    35  	if !authorizer.AuthClient() {
    36  		return nil, errors.Trace(common.ErrPerm)
    37  	}
    38  
    39  	// Get the backup paths.
    40  	dataDir, err := extractResourceValue(resources, "dataDir")
    41  	if err != nil {
    42  		return nil, errors.Trace(err)
    43  	}
    44  	logsDir, err := extractResourceValue(resources, "logDir")
    45  	if err != nil {
    46  		return nil, errors.Trace(err)
    47  	}
    48  	paths := backups.Paths{
    49  		DataDir: dataDir,
    50  		LogsDir: logsDir,
    51  	}
    52  
    53  	// Build the API.
    54  	machineID, err := extractResourceValue(resources, "machineID")
    55  	if err != nil {
    56  		return nil, errors.Trace(err)
    57  	}
    58  	b := API{
    59  		st:        st,
    60  		paths:     &paths,
    61  		machineID: machineID,
    62  	}
    63  	return &b, nil
    64  }
    65  
    66  func extractResourceValue(resources *common.Resources, key string) (string, error) {
    67  	res := resources.Get(key)
    68  	strRes, ok := res.(common.StringResource)
    69  	if !ok {
    70  		if res == nil {
    71  			strRes = ""
    72  		} else {
    73  			return "", errors.Errorf("invalid %s resource: %v", key, res)
    74  		}
    75  	}
    76  	return strRes.String(), nil
    77  }
    78  
    79  var newBackups = func(st *state.State) (backups.Backups, io.Closer) {
    80  	stor := backups.NewStorage(st)
    81  	return backups.NewBackups(stor), stor
    82  }
    83  
    84  // ResultFromMetadata updates the result with the information in the
    85  // metadata value.
    86  func ResultFromMetadata(meta *backups.Metadata) params.BackupsMetadataResult {
    87  	var result params.BackupsMetadataResult
    88  
    89  	result.ID = meta.ID()
    90  
    91  	result.Checksum = meta.Checksum()
    92  	result.ChecksumFormat = meta.ChecksumFormat()
    93  	result.Size = meta.Size()
    94  	if meta.Stored() != nil {
    95  		result.Stored = *(meta.Stored())
    96  	}
    97  
    98  	result.Started = meta.Started
    99  	if meta.Finished != nil {
   100  		result.Finished = *meta.Finished
   101  	}
   102  	result.Notes = meta.Notes
   103  
   104  	result.Environment = meta.Origin.Environment
   105  	result.Machine = meta.Origin.Machine
   106  	result.Hostname = meta.Origin.Hostname
   107  	result.Version = meta.Origin.Version
   108  
   109  	return result
   110  }
   111  
   112  // MetadataFromResult returns a new Metadata based on the result. The ID
   113  // of the metadata is not set. Call meta.SetID() if that is desired.
   114  // Likewise with Stored and meta.SetStored().
   115  func MetadataFromResult(result params.BackupsMetadataResult) *backups.Metadata {
   116  	meta := backups.NewMetadata()
   117  	meta.Started = result.Started
   118  	if !result.Finished.IsZero() {
   119  		meta.Finished = &result.Finished
   120  	}
   121  	meta.Origin.Environment = result.Environment
   122  	meta.Origin.Machine = result.Machine
   123  	meta.Origin.Hostname = result.Hostname
   124  	meta.Origin.Version = result.Version
   125  	meta.Notes = result.Notes
   126  	meta.SetFileInfo(result.Size, result.Checksum, result.ChecksumFormat)
   127  	return meta
   128  }