forked from stmcginnis/gofish
-
Notifications
You must be signed in to change notification settings - Fork 0
/
assembly.go
173 lines (150 loc) · 4.96 KB
/
assembly.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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
//
// SPDX-License-Identifier: BSD-3-Clause
//
package redfish
import (
"encoding/json"
"reflect"
"github.com/stmcginnis/gofish/common"
)
// Assembly is used to represent an assembly information resource for a
// Redfish implementation.
type Assembly struct {
common.Entity
// ODataContext is the odata context.
ODataContext string `json:"@odata.context"`
// ODataType is the odata type.
ODataType string `json:"@odata.type"`
// Assemblies shall be the definition for assembly records for a Redfish
// implementation.
Assemblies []AssemblyData
// Assemblies@odata.count is
AssembliesCount int `json:"Assemblies@odata.count"`
// Description provides a description of this resource.
Description string
// rawData holds the original serialized JSON so we can compare updates.
rawData []byte
}
// UnmarshalJSON unmarshals a Assembly object from the raw JSON.
func (assembly *Assembly) UnmarshalJSON(b []byte) error {
type temp Assembly
var t struct {
temp
}
err := json.Unmarshal(b, &t)
if err != nil {
return err
}
*assembly = Assembly(t.temp)
// This is a read/write object, so we need to save the raw object data for later
assembly.rawData = b
return nil
}
// Update commits updates to this object's properties to the running system.
func (assembly *Assembly) Update() error {
// Get a representation of the object's original state so we can find what
// to update.
original := new(Assembly)
err := original.UnmarshalJSON(assembly.rawData)
if err != nil {
return err
}
readWriteFields := []string{
"Assemblies",
}
originalElement := reflect.ValueOf(original).Elem()
currentElement := reflect.ValueOf(assembly).Elem()
return assembly.Entity.Update(originalElement, currentElement, readWriteFields)
}
// GetAssembly will get a Assembly instance from the service.
func GetAssembly(c common.Client, uri string) (*Assembly, error) {
var assembly Assembly
return &assembly, assembly.Get(c, uri, &assembly)
}
// ListReferencedAssemblys gets the collection of Assembly from
// a provided reference.
func ListReferencedAssemblys(c common.Client, link string) ([]*Assembly, error) { //nolint:dupl
var result []*Assembly
if link == "" {
return result, nil
}
type GetResult struct {
Item *Assembly
Link string
Error error
}
ch := make(chan GetResult)
collectionError := common.NewCollectionError()
get := func(link string) {
assembly, err := GetAssembly(c, link)
ch <- GetResult{Item: assembly, 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
}
// AssemblyData is information about an assembly.
type AssemblyData struct {
// BinaryDataURI shall be a URI at which the Service provides for the
// download of the OEM-specific binary image of the assembly data. An HTTP
// GET from this URI shall return a response payload of MIME time
// application/octet-stream. An HTTP PUT to this URI, if supported by the
// Service, shall replace the binary image of the assembly.
BinaryDataURI string
// Description provides a description of this resource.
Description string
// EngineeringChangeLevel shall be the Engineering Change Level (ECL) or
// revision of the assembly.
EngineeringChangeLevel string
// MemberID shall uniquely identify the member within the collection.
MemberID string
// Model shall be the name by which the manufacturer generally refers to the
// assembly.
Model string
// Name provides the name of the resource.
Name string
// PartNumber shall be the part number of the assembly.
PartNumber string
// PhysicalContext shall be a description of the physical context for this
// assembly data.
PhysicalContext string
// Producer shall be the name of the company which supplied or manufactured
// this assembly. This value shall be equal to the 'Manufacturer' field in a
// PLDM FRU structure, if applicable, for this assembly.
Producer string
// ProductionDate shall be the date of production or manufacture for this
// assembly. The time of day portion of the property shall be '00:00:00Z' if
// the time of day is unknown.
ProductionDate string
// SKU shall be the name of the assembly.
SKU string
// SerialNumber is used to identify the assembly.
SerialNumber string
// SparePartNumber shall be the name of the assembly.
SparePartNumber string
// Status is This property shall contain any status or health properties
// of the resource.
Status common.Status
// Vendor shall be the name of the company which provides the final product
// that includes this assembly. This value shall be equal to the 'Vendor'
// field in a PLDM FRU structure, if applicable, for this assembly.
Vendor string
// Version shall be the version of the assembly as determined by the vendor
// or supplier.
Version string
}