-
Notifications
You must be signed in to change notification settings - Fork 1
/
firmware.go
104 lines (87 loc) · 3.24 KB
/
firmware.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
package c8y
import (
"context"
"fmt"
"github.com/reubenmiller/go-c8y/pkg/c8y/binary"
)
const FragmentFirmware = "c8y_Firmware"
const FragmentFirmwareBinary = "c8y_FirmwareBinary"
// InventoryFirmwareService responsible for all inventory api calls
type InventoryFirmwareService service
// AgentFragment is the special agent fragment used to identify managed objects which are representations of an Agent.
type FirmwareFragment struct {
Version string `json:"version"`
URL string `json:"url"`
}
// Firmware is the general Inventory Managed Object data structure
type Firmware struct {
ManagedObject
}
// FirmwareVersion firmware version details
type FirmwareVersion struct {
ManagedObject
Firmware *FirmwareFragment `json:"c8y_Firmware,omitempty"`
}
// NewFirmware returns a simple firmware managed object
func NewFirmware(name string) *Firmware {
return &Firmware{
ManagedObject: ManagedObject{
Name: name,
Type: FragmentFirmware,
},
}
}
// NewFirmwareVersion returns a firmware version
func NewFirmwareVersion(name string) *FirmwareVersion {
return &FirmwareVersion{
ManagedObject: ManagedObject{
Name: name,
Type: FragmentFirmwareBinary,
},
}
}
// CreateVersion upload a binary and creates a firmware version referencing it
// THe URL can be left blank in the firmware version as it will be automatically set if a filename is provided
func (s *InventoryFirmwareService) CreateVersion(ctx context.Context, firmwareID string, binaryFile binary.MultiPartReader, version FirmwareVersion) (*ManagedObject, *Response, error) {
return s.client.Inventory.CreateChildAdditionWithBinary(ctx, firmwareID, binaryFile, func(binaryURL string) interface{} {
version.Firmware.URL = binaryURL
return version
})
}
// GetFirmwareByName returns firmware packages by name
func (s *InventoryFirmwareService) GetFirmwareByName(ctx context.Context, name string, paging *PaginationOptions) (*ManagedObjectCollection, *Response, error) {
if paging == nil {
paging = NewPaginationOptions(100)
}
opt := &ManagedObjectOptions{
Query: fmt.Sprintf("$filter=(name eq '%s') and type eq '%s' $orderby=name,creationTime", name, FragmentFirmware),
PaginationOptions: *paging,
}
return s.client.Inventory.GetManagedObjects(ctx, opt)
}
// GetFirmwareVersionsByName returns firmware package versions by name
// firmware: can also be referenced by name
func (s *InventoryFirmwareService) GetFirmwareVersionsByName(ctx context.Context, firmware string, name string, withParents bool, paging *PaginationOptions) (*ManagedObjectCollection, *Response, error) {
if paging == nil {
paging = NewPaginationOptions(100)
}
if !IsID(firmware) {
// Lookup via name
collection, resp, err := s.GetFirmwareByName(ctx, firmware, NewPaginationOptions(2))
if err != nil {
return nil, resp, err
}
if len(collection.ManagedObjects) == 0 {
return nil, resp, ErrNotFound
}
if len(collection.ManagedObjects) > 0 {
firmware = collection.ManagedObjects[0].ID
}
}
opt := &ManagedObjectOptions{
Query: fmt.Sprintf("$filter=(c8y_Firmware.version eq '%s') and bygroupid(%s) $orderby=c8y_Firmware.version,creationTime", name, firmware),
PaginationOptions: *paging,
WithParents: withParents,
}
return s.client.Inventory.GetManagedObjects(ctx, opt)
}