github.com/microsoft/moc@v0.17.1/pkg/status/status.go (about) 1 // Copyright (c) Microsoft Corporation 2 // Licensed under the Apache v2.0 license. 3 package status 4 5 import ( 6 "fmt" 7 "strconv" 8 "time" 9 10 proto "github.com/golang/protobuf/proto" 11 common "github.com/microsoft/moc/rpc/common" 12 ) 13 14 // InitStatus 15 func InitStatus() *common.Status { 16 return &common.Status{ 17 Health: &common.Health{}, 18 ProvisioningStatus: &common.ProvisionStatus{}, 19 LastError: &common.Error{}, 20 Version: GenerateVersion(), 21 DownloadStatus: &common.DownloadStatus{}, 22 ValidationStatus: &common.ValidationStatus{}, 23 } 24 } 25 26 // SetError 27 func SetError(s *common.Status, err error) { 28 if err != nil { 29 s.LastError.Message = fmt.Sprintf("%+v", err) 30 } else { 31 s.LastError.Message = "" // Clear the error 32 } 33 } 34 35 // SetHealth 36 func SetHealth(s *common.Status, hState common.HealthState, err ...error) { 37 s.Health.PreviousState = s.Health.CurrentState 38 s.Health.CurrentState = hState 39 if len(err) > 0 { 40 SetError(s, err[0]) 41 } 42 } 43 44 func IsHealthStateMissing(s *common.Status) bool { 45 hstatus := s.GetHealth().GetCurrentState() 46 return (hstatus == common.HealthState_MISSING) 47 } 48 49 func IsDeleted(s *common.Status) bool { 50 return (IsProvisionStatus(s, common.ProvisionState_DELETED) || 51 IsProvisionStatus(s, common.ProvisionState_DEPROVISIONED)) 52 } 53 54 func IsProvisionStatus(s *common.Status, pState common.ProvisionState) bool { 55 return s.ProvisioningStatus.CurrentState == pState 56 } 57 58 // SetProvisionStatus 59 func SetProvisionStatus(s *common.Status, pState common.ProvisionState, err ...error) { 60 s.ProvisioningStatus.PreviousState = s.ProvisioningStatus.CurrentState 61 s.ProvisioningStatus.CurrentState = pState 62 if len(err) > 0 { 63 SetError(s, err[0]) 64 } 65 } 66 67 // GenerateVersion 68 func GenerateVersion() *common.Version { 69 return &common.Version{ 70 Number: strconv.FormatInt(time.Now().UnixNano(), 10), 71 } 72 } 73 74 // GetProvisioningState string 75 func GetProvisioningState(status *common.ProvisionStatus) *string { 76 stateString := status.GetCurrentState().String() 77 return &stateString 78 } 79 80 // SetDownloadStatus 81 func SetDownloadStatus(s *common.Status, dProgressPercentage, dDownloadSizeInBytes, dFileSizeInBytes int64, err ...error) { 82 s.DownloadStatus.ProgressPercentage = dProgressPercentage 83 s.DownloadStatus.DownloadSizeInBytes = dDownloadSizeInBytes 84 s.DownloadStatus.FileSizeInBytes = dFileSizeInBytes 85 if len(err) > 0 { 86 SetError(s, err[0]) 87 } 88 } 89 90 func SetValidationStatus(s *common.Status, validationState []*common.ValidationState) { 91 s.ValidationStatus = new(common.ValidationStatus) 92 s.ValidationStatus.ValidationState = validationState 93 } 94 95 func GetValidationStatus(s *common.Status) []*common.ValidationState { 96 return s.GetValidationStatus().GetValidationState() 97 } 98 99 // GetStatuses - converts status to map 100 func GetStatuses(status *common.Status) map[string]*string { 101 statuses := map[string]*string{} 102 pstate := status.GetProvisioningStatus().String() 103 statuses["ProvisionState"] = &pstate 104 hstate := status.GetHealth().String() 105 statuses["HealthState"] = &hstate 106 estate := status.GetLastError().String() 107 statuses["Error"] = &estate 108 version := status.GetVersion().Number 109 statuses["Version"] = &version 110 dstate := status.GetDownloadStatus().String() 111 statuses["DownloadStatus"] = &dstate 112 return statuses 113 } 114 115 // GetFromStatuses - parses the map to status 116 func GetFromStatuses(statuses map[string]*string) (status *common.Status) { 117 status = &common.Status{} 118 if val, ok := statuses["ProvisionState"]; ok { 119 ps := new(common.ProvisionStatus) 120 proto.UnmarshalText(*val, ps) 121 status.ProvisioningStatus = ps 122 } 123 if val, ok := statuses["HealthState"]; ok { 124 ps := new(common.Health) 125 proto.UnmarshalText(*val, ps) 126 status.Health = ps 127 } 128 if val, ok := statuses["Error"]; ok { 129 ps := new(common.Error) 130 proto.UnmarshalText(*val, ps) 131 status.LastError = ps 132 } 133 if val, ok := statuses["DownloadStatus"]; ok { 134 ps := new(common.DownloadStatus) 135 proto.UnmarshalText(*val, ps) 136 status.DownloadStatus = ps 137 } 138 139 return 140 }