package models import ( "cloud.o-forge.io/core/oc-catalog/models/rtype" ) type Link struct { // ID primitive.ObjectID `json:"ID" bson:"_id" required:"true" example:"5099803df3f4948bd2f98391"` Source string `json:"source" description:"id in the workflow of the source object"` Destination string `json:"destination" description:"id in the workflow of the destination object"` DCLink bool `json:"dcLink" description:"is this a link with a datacenter"` } // Use ResourceObject parameter to process certain components type differently // and Id's to identify each component as a node in an oriented graph // In the case of DCLink we choose to always consider the DC as the destination // in order to facilitate some logic func NewLink(src ResourceObject, srcId string, dst ResourceObject, dstId string) (link Link) { link.Source = srcId link.Destination = dstId // If the link is between a DC and a component make sure that the DC is destination // and if the component is computing, update the DataCenterID if (src.getRtype() == rtype.DATACENTER || dst.getRtype() == rtype.DATACENTER){ var linked ResourceObject link.DCLink = true if src.getRtype() == rtype.DATACENTER { linked = dst } else { linked = src } if( link.DCLink && src.getRtype() == rtype.DATACENTER){ link.Destination = srcId link.Source = dstId } if (linked.getRtype() == rtype.COMPUTING){ linked.(*ComputingObject).DataCenterID = link.Destination } } return } // So far only computing components expect the ID of the DC in their attributes // func (l *Link) AddLinkToDataCenter(component models.ComputingModel) { // }