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 }