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  }