github.com/Axway/agent-sdk@v1.1.101/pkg/apic/apiserver/models/catalog/v1alpha1/AssetResource.go (about) 1 /* 2 * This file is automatically generated 3 */ 4 5 package catalog 6 7 import ( 8 "encoding/json" 9 "fmt" 10 11 apiv1 "github.com/Axway/agent-sdk/pkg/apic/apiserver/models/api/v1" 12 13 "github.com/Axway/agent-sdk/pkg/util/log" 14 ) 15 16 var ( 17 AssetResourceCtx log.ContextField = "assetResource" 18 19 _AssetResourceGVK = apiv1.GroupVersionKind{ 20 GroupKind: apiv1.GroupKind{ 21 Group: "catalog", 22 Kind: "AssetResource", 23 }, 24 APIVersion: "v1alpha1", 25 } 26 27 AssetResourceScopes = []string{"Asset", "AssetRelease"} 28 ) 29 30 const ( 31 AssetResourceResourceName = "assetresources" 32 AssetResourceReferencesSubResourceName = "references" 33 AssetResourceReleasehashSubResourceName = "releasehash" 34 ) 35 36 func AssetResourceGVK() apiv1.GroupVersionKind { 37 return _AssetResourceGVK 38 } 39 40 func init() { 41 apiv1.RegisterGVK(_AssetResourceGVK, AssetResourceScopes[0], AssetResourceResourceName) 42 log.RegisterContextField(AssetResourceCtx) 43 } 44 45 // AssetResource Resource 46 type AssetResource struct { 47 apiv1.ResourceMeta 48 Owner *apiv1.Owner `json:"owner"` 49 References AssetResourceReferences `json:"references"` 50 Releasehash interface{} `json:"releasehash"` 51 Spec AssetResourceSpec `json:"spec"` 52 } 53 54 // NewAssetResource creates an empty *AssetResource 55 func NewAssetResource(name, scopeKind, scopeName string) (*AssetResource, error) { 56 validScope := false 57 for _, s := range AssetResourceScopes { 58 if scopeKind == s { 59 validScope = true 60 break 61 } 62 } 63 if !validScope { 64 return nil, fmt.Errorf("scope '%s' not valid for AssetResource kind", scopeKind) 65 } 66 67 return &AssetResource{ 68 ResourceMeta: apiv1.ResourceMeta{ 69 Name: name, 70 GroupVersionKind: _AssetResourceGVK, 71 Metadata: apiv1.Metadata{ 72 Scope: apiv1.MetadataScope{ 73 Name: scopeName, 74 Kind: scopeKind, 75 }, 76 }, 77 }, 78 }, nil 79 } 80 81 // AssetResourceFromInstanceArray converts a []*ResourceInstance to a []*AssetResource 82 func AssetResourceFromInstanceArray(fromArray []*apiv1.ResourceInstance) ([]*AssetResource, error) { 83 newArray := make([]*AssetResource, 0) 84 for _, item := range fromArray { 85 res := &AssetResource{} 86 err := res.FromInstance(item) 87 if err != nil { 88 return make([]*AssetResource, 0), err 89 } 90 newArray = append(newArray, res) 91 } 92 93 return newArray, nil 94 } 95 96 // AsInstance converts a AssetResource to a ResourceInstance 97 func (res *AssetResource) AsInstance() (*apiv1.ResourceInstance, error) { 98 meta := res.ResourceMeta 99 meta.GroupVersionKind = AssetResourceGVK() 100 res.ResourceMeta = meta 101 102 m, err := json.Marshal(res) 103 if err != nil { 104 return nil, err 105 } 106 107 instance := apiv1.ResourceInstance{} 108 err = json.Unmarshal(m, &instance) 109 if err != nil { 110 return nil, err 111 } 112 113 return &instance, nil 114 } 115 116 // FromInstance converts a ResourceInstance to a AssetResource 117 func (res *AssetResource) FromInstance(ri *apiv1.ResourceInstance) error { 118 if ri == nil { 119 res = nil 120 return nil 121 } 122 var err error 123 rawResource := ri.GetRawResource() 124 if rawResource == nil { 125 rawResource, err = json.Marshal(ri) 126 if err != nil { 127 return err 128 } 129 } 130 err = json.Unmarshal(rawResource, res) 131 return err 132 } 133 134 // MarshalJSON custom marshaller to handle sub resources 135 func (res *AssetResource) MarshalJSON() ([]byte, error) { 136 m, err := json.Marshal(&res.ResourceMeta) 137 if err != nil { 138 return nil, err 139 } 140 141 var out map[string]interface{} 142 err = json.Unmarshal(m, &out) 143 if err != nil { 144 return nil, err 145 } 146 147 out["owner"] = res.Owner 148 out["references"] = res.References 149 out["releasehash"] = res.Releasehash 150 out["spec"] = res.Spec 151 152 return json.Marshal(out) 153 } 154 155 // UnmarshalJSON custom unmarshaller to handle sub resources 156 func (res *AssetResource) UnmarshalJSON(data []byte) error { 157 var err error 158 159 aux := &apiv1.ResourceInstance{} 160 err = json.Unmarshal(data, aux) 161 if err != nil { 162 return err 163 } 164 165 res.ResourceMeta = aux.ResourceMeta 166 res.Owner = aux.Owner 167 168 // ResourceInstance holds the spec as a map[string]interface{}. 169 // Convert it to bytes, then convert to the spec type for the resource. 170 sr, err := json.Marshal(aux.Spec) 171 if err != nil { 172 return err 173 } 174 175 err = json.Unmarshal(sr, &res.Spec) 176 if err != nil { 177 return err 178 } 179 180 // marshalling subresource References 181 if v, ok := aux.SubResources["references"]; ok { 182 sr, err = json.Marshal(v) 183 if err != nil { 184 return err 185 } 186 187 delete(aux.SubResources, "references") 188 err = json.Unmarshal(sr, &res.References) 189 if err != nil { 190 return err 191 } 192 } 193 194 // marshalling subresource Releasehash 195 if v, ok := aux.SubResources["releasehash"]; ok { 196 sr, err = json.Marshal(v) 197 if err != nil { 198 return err 199 } 200 201 delete(aux.SubResources, "releasehash") 202 err = json.Unmarshal(sr, &res.Releasehash) 203 if err != nil { 204 return err 205 } 206 } 207 208 return nil 209 } 210 211 // PluralName returns the plural name of the resource 212 func (res *AssetResource) PluralName() string { 213 return AssetResourceResourceName 214 }