forked from stmcginnis/gofish
-
Notifications
You must be signed in to change notification settings - Fork 0
/
compositionservice.go
138 lines (116 loc) · 3.96 KB
/
compositionservice.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
//
// SPDX-License-Identifier: BSD-3-Clause
//
package redfish
import (
"encoding/json"
"reflect"
"github.com/stmcginnis/gofish/common"
)
// CompositionService is used to represent the Composition Service
// Properties for a Redfish implementation.
type CompositionService struct {
common.Entity
// ODataContext is the odata context.
ODataContext string `json:"@odata.context"`
// ODataType is the odata type.
ODataType string `json:"@odata.type"`
// AllowOverprovisioning shall be a boolean indicating whether this service
// is allowed to overprovision a composition relative to the composition request.
AllowOverprovisioning bool
// AllowZoneAffinity shall be a boolean indicating whether a client is
// allowed to request that given composition request is fulfilled by a
// specified Resource Zone.
AllowZoneAffinity bool
// Description provides a description of this resource.
Description string
// resourceBlocks shall contain the link to a collection of type ResourceBlockCollection.
resourceBlocks string
// resourceZones shall contain the link to a collection of type ZoneCollection.
resourceZones string
// ServiceEnabled shall be a boolean indicating whether this service is enabled.
ServiceEnabled bool
// Status shall contain any status or health properties of the resource.
Status common.Status
// rawData holds the original serialized JSON so we can compare updates.
rawData []byte
}
// UnmarshalJSON unmarshals CompositionService object from the raw JSON.
func (compositionservice *CompositionService) UnmarshalJSON(b []byte) error {
type temp CompositionService
var t struct {
temp
ResourceBlocks common.Link
ResourceZones common.Link
}
err := json.Unmarshal(b, &t)
if err != nil {
return err
}
// Extract the links to other entities for later
*compositionservice = CompositionService(t.temp)
compositionservice.resourceBlocks = t.ResourceBlocks.String()
compositionservice.resourceZones = t.ResourceZones.String()
// This is a read/write object, so we need to save the raw object data for later
compositionservice.rawData = b
return nil
}
// Update commits updates to this object's properties to the running system.
func (compositionservice *CompositionService) Update() error {
// Get a representation of the object's original state so we can find what
// to update.
original := new(CompositionService)
err := original.UnmarshalJSON(compositionservice.rawData)
if err != nil {
return err
}
readWriteFields := []string{
"AllowOverprovisioning",
"ServiceEnabled",
}
originalElement := reflect.ValueOf(original).Elem()
currentElement := reflect.ValueOf(compositionservice).Elem()
return compositionservice.Entity.Update(originalElement, currentElement, readWriteFields)
}
// GetCompositionService will get a CompositionService instance from the service.
func GetCompositionService(c common.Client, uri string) (*CompositionService, error) {
var compositionservice CompositionService
return &compositionservice, compositionservice.Get(c, uri, &compositionservice)
}
// ListReferencedCompositionServices gets the collection of CompositionService from
// a provided reference.
func ListReferencedCompositionServices(c common.Client, link string) ([]*CompositionService, error) { //nolint:dupl
var result []*CompositionService
if link == "" {
return result, nil
}
type GetResult struct {
Item *CompositionService
Link string
Error error
}
ch := make(chan GetResult)
collectionError := common.NewCollectionError()
get := func(link string) {
compositionservice, err := GetCompositionService(c, link)
ch <- GetResult{Item: compositionservice, Link: link, Error: err}
}
go func() {
err := common.CollectList(get, c, link)
if err != nil {
collectionError.Failures[link] = err
}
close(ch)
}()
for r := range ch {
if r.Error != nil {
collectionError.Failures[r.Link] = r.Error
} else {
result = append(result, r.Item)
}
}
if collectionError.Empty() {
return result, nil
}
return result, collectionError
}