|
|
@@ -1,8 +1,6 @@
|
|
|
package analytics
|
|
|
|
|
|
import (
|
|
|
- "fmt"
|
|
|
-
|
|
|
"github.com/porter-dev/porter/internal/models"
|
|
|
segment "gopkg.in/segmentio/analytics-go.v3"
|
|
|
)
|
|
|
@@ -13,97 +11,413 @@ type segmentTrack interface {
|
|
|
getProperties() segment.Properties
|
|
|
}
|
|
|
|
|
|
-type segmentNewUserTrack struct {
|
|
|
- userId string
|
|
|
- userEmail string
|
|
|
+type defaultTrackOpts struct {
|
|
|
+ AdditionalProps map[string]interface{}
|
|
|
+}
|
|
|
+
|
|
|
+type defaultSegmentTrack struct {
|
|
|
+ event SegmentEvent
|
|
|
+ properties segmentProperties
|
|
|
+}
|
|
|
+
|
|
|
+func getDefaultSegmentTrack(additionalProps map[string]interface{}, event SegmentEvent) *defaultSegmentTrack {
|
|
|
+ props := newSegmentProperties()
|
|
|
+ props.addAdditionalProperties(additionalProps)
|
|
|
+
|
|
|
+ return &defaultSegmentTrack{
|
|
|
+ event: event,
|
|
|
+ properties: props,
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func (t *defaultSegmentTrack) getEvent() SegmentEvent {
|
|
|
+ return t.event
|
|
|
}
|
|
|
|
|
|
-// CreateSegmentNewUserTrack creates a track of type "New User", which
|
|
|
-// tracks when a user has registered
|
|
|
-func CreateSegmentNewUserTrack(user *models.User) *segmentNewUserTrack {
|
|
|
- userId := fmt.Sprintf("%v", user.ID)
|
|
|
+func (t *defaultSegmentTrack) getProperties() segment.Properties {
|
|
|
+ props := segment.NewProperties()
|
|
|
|
|
|
- return &segmentNewUserTrack{
|
|
|
- userId: userId,
|
|
|
- userEmail: user.Email,
|
|
|
+ for key, val := range t.properties {
|
|
|
+ props = props.Set(key, val)
|
|
|
}
|
|
|
+
|
|
|
+ return props
|
|
|
+}
|
|
|
+
|
|
|
+type segmentProperties map[string]interface{}
|
|
|
+
|
|
|
+func newSegmentProperties() segmentProperties {
|
|
|
+ props := make(map[string]interface{})
|
|
|
+
|
|
|
+ return props
|
|
|
}
|
|
|
|
|
|
-func (t *segmentNewUserTrack) getUserId() string {
|
|
|
- return t.userId
|
|
|
+func (p segmentProperties) addProjectProperties(opts *ProjectScopedTrackOpts) {
|
|
|
+ p["proj_id"] = opts.ProjectID
|
|
|
}
|
|
|
|
|
|
-func (t *segmentNewUserTrack) getEvent() SegmentEvent {
|
|
|
- return NewUser
|
|
|
+func (p segmentProperties) addClusterProperties(opts *ClusterScopedTrackOpts) {
|
|
|
+ p["cluster_id"] = opts.ClusterID
|
|
|
}
|
|
|
|
|
|
-func (t *segmentNewUserTrack) getProperties() segment.Properties {
|
|
|
- return segment.NewProperties().Set("email", t.userEmail)
|
|
|
+func (p segmentProperties) addRegistryProperties(opts *RegistryScopedTrackOpts) {
|
|
|
+ p["registry_id"] = opts.RegistryID
|
|
|
}
|
|
|
|
|
|
-type segmentRedeployViaWebhookTrack struct {
|
|
|
- userId string
|
|
|
- repository string
|
|
|
+func (p segmentProperties) addApplicationProperties(opts *ApplicationScopedTrackOpts) {
|
|
|
+ p["app_name"] = opts.Name
|
|
|
+ p["app_namespace"] = opts.Namespace
|
|
|
+ p["chart_name"] = opts.ChartName
|
|
|
}
|
|
|
|
|
|
-// CreateSegmentRedeployViaWebhookTrack creates a track of type "Triggered Re-deploy via Webhook", which
|
|
|
-// tracks whenever a repository is redeployed via webhook call
|
|
|
-func CreateSegmentRedeployViaWebhookTrack(userId string, repository string) *segmentRedeployViaWebhookTrack {
|
|
|
- return &segmentRedeployViaWebhookTrack{
|
|
|
- userId: userId,
|
|
|
- repository: repository,
|
|
|
+func (p segmentProperties) addAdditionalProperties(props map[string]interface{}) {
|
|
|
+ for key, val := range props {
|
|
|
+ p[key] = val
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-func (t *segmentRedeployViaWebhookTrack) getUserId() string {
|
|
|
- return t.userId
|
|
|
+// UserCreateTrackOpts are the options for creating a track when a user is created
|
|
|
+type UserCreateTrackOpts struct {
|
|
|
+ *UserScopedTrackOpts
|
|
|
}
|
|
|
|
|
|
-func (t *segmentRedeployViaWebhookTrack) getEvent() SegmentEvent {
|
|
|
- return RedeployViaWebhook
|
|
|
+// UserCreateTrack returns a track for when a user is created
|
|
|
+func UserCreateTrack(opts *UserCreateTrackOpts) segmentTrack {
|
|
|
+ additionalProps := make(map[string]interface{})
|
|
|
+
|
|
|
+ return getSegmentUserTrack(
|
|
|
+ opts.UserScopedTrackOpts,
|
|
|
+ getDefaultSegmentTrack(additionalProps, UserCreate),
|
|
|
+ )
|
|
|
}
|
|
|
|
|
|
-func (t *segmentRedeployViaWebhookTrack) getProperties() segment.Properties {
|
|
|
- return segment.NewProperties().Set("repository", t.repository)
|
|
|
+// ProjectCreateTrackOpts are the options for creating a track when a project is created
|
|
|
+type ProjectCreateTrackOpts struct {
|
|
|
+ *ProjectScopedTrackOpts
|
|
|
}
|
|
|
|
|
|
-type segmentNewClusterEventTrack struct {
|
|
|
- userId string
|
|
|
- projId string
|
|
|
- clusterName string
|
|
|
- clusterType string // EKS, DOKS, or GKE
|
|
|
- eventType string // connected, provisioned, or destroyed
|
|
|
+// ProjectCreateTrack returns a track for when a project is created
|
|
|
+func ProjectCreateTrack(opts *ProjectCreateTrackOpts) segmentTrack {
|
|
|
+ additionalProps := make(map[string]interface{})
|
|
|
+
|
|
|
+ return getSegmentProjectTrack(
|
|
|
+ opts.ProjectScopedTrackOpts,
|
|
|
+ getDefaultSegmentTrack(additionalProps, ProjectCreate),
|
|
|
+ )
|
|
|
}
|
|
|
|
|
|
-// NewClusterEventOpts are the parameters for creating a "New Cluster Event" track
|
|
|
-type NewClusterEventOpts struct {
|
|
|
- UserId string
|
|
|
- ProjId string
|
|
|
- ClusterName string
|
|
|
- ClusterType string // EKS, DOKS, or GKE
|
|
|
- EventType string // connected, provisioned, or destroyed
|
|
|
+// ClusterProvisioningStartTrackOpts are the options for creating a track when a cluster
|
|
|
+// has started provisioning
|
|
|
+type ClusterProvisioningStartTrackOpts struct {
|
|
|
+ // note that this is a project-scoped track, since the cluster has not been created yet
|
|
|
+ *ProjectScopedTrackOpts
|
|
|
+
|
|
|
+ ClusterType models.InfraKind
|
|
|
+ InfraID uint
|
|
|
}
|
|
|
|
|
|
-// CreateSegmentNewClusterEvent creates a track of type "New Cluster Event", which
|
|
|
-// tracks whenever a cluster is newly provisioned, connected, or destroyed.
|
|
|
-func CreateSegmentNewClusterEvent(opts *NewClusterEventOpts) *segmentNewClusterEventTrack {
|
|
|
- return &segmentNewClusterEventTrack{
|
|
|
- userId: opts.UserId,
|
|
|
- projId: opts.ProjId,
|
|
|
- clusterName: opts.ClusterName,
|
|
|
- clusterType: opts.ClusterType,
|
|
|
- eventType: opts.EventType,
|
|
|
- }
|
|
|
+// ClusterProvisioningStartTrack returns a track for when a cluster
|
|
|
+// has started provisioning
|
|
|
+func ClusterProvisioningStartTrack(opts *ClusterProvisioningStartTrackOpts) segmentTrack {
|
|
|
+ additionalProps := make(map[string]interface{})
|
|
|
+ additionalProps["cluster_type"] = opts.ClusterType
|
|
|
+ additionalProps["infra_id"] = opts.InfraID
|
|
|
+
|
|
|
+ return getSegmentProjectTrack(
|
|
|
+ opts.ProjectScopedTrackOpts,
|
|
|
+ getDefaultSegmentTrack(additionalProps, ClusterProvisioningStart),
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+// ClusterProvisioningErrorTrackOpts are the options for creating a track when a cluster
|
|
|
+// has experienced a provisioning error
|
|
|
+type ClusterProvisioningErrorTrackOpts struct {
|
|
|
+ // note that this is a project-scoped track, since the cluster has not been created yet
|
|
|
+ *ProjectScopedTrackOpts
|
|
|
+
|
|
|
+ ClusterType models.InfraKind
|
|
|
+ InfraID uint
|
|
|
+}
|
|
|
+
|
|
|
+// ClusterProvisioningErrorTrack returns a track for when a cluster
|
|
|
+// has experienced a provisioning error
|
|
|
+func ClusterProvisioningErrorTrack(opts *ClusterProvisioningErrorTrackOpts) segmentTrack {
|
|
|
+ additionalProps := make(map[string]interface{})
|
|
|
+ additionalProps["cluster_type"] = opts.ClusterType
|
|
|
+ additionalProps["infra_id"] = opts.InfraID
|
|
|
+
|
|
|
+ return getSegmentProjectTrack(
|
|
|
+ opts.ProjectScopedTrackOpts,
|
|
|
+ getDefaultSegmentTrack(additionalProps, ClusterProvisioningError),
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+// ClusterProvisioningSuccessTrackOpts are the options for creating a track when a cluster
|
|
|
+// has successfully provisioned
|
|
|
+type ClusterProvisioningSuccessTrackOpts struct {
|
|
|
+ *ClusterScopedTrackOpts
|
|
|
+
|
|
|
+ ClusterType models.InfraKind
|
|
|
+ InfraID uint
|
|
|
+}
|
|
|
+
|
|
|
+// ClusterProvisioningSuccessTrack returns a new track for when a cluster
|
|
|
+// has successfully provisioned
|
|
|
+func ClusterProvisioningSuccessTrack(opts *ClusterProvisioningSuccessTrackOpts) segmentTrack {
|
|
|
+ additionalProps := make(map[string]interface{})
|
|
|
+ additionalProps["cluster_type"] = opts.ClusterType
|
|
|
+ additionalProps["infra_id"] = opts.InfraID
|
|
|
+
|
|
|
+ return getSegmentClusterTrack(
|
|
|
+ opts.ClusterScopedTrackOpts,
|
|
|
+ getDefaultSegmentTrack(additionalProps, ClusterProvisioningSuccess),
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+// ClusterConnectionStartTrackOpts are the options for creating a track when a cluster
|
|
|
+// connection has started
|
|
|
+type ClusterConnectionStartTrackOpts struct {
|
|
|
+ // note that this is a project-scoped track, since the cluster has not been created yet
|
|
|
+ *ProjectScopedTrackOpts
|
|
|
+
|
|
|
+ ClusterCandidateID uint
|
|
|
+}
|
|
|
+
|
|
|
+// ClusterConnectionStartTrack returns a new track for when a cluster
|
|
|
+// connection has started
|
|
|
+func ClusterConnectionStartTrack(opts *ClusterConnectionStartTrackOpts) segmentTrack {
|
|
|
+ additionalProps := make(map[string]interface{})
|
|
|
+ additionalProps["cc_id"] = opts.ClusterCandidateID
|
|
|
+
|
|
|
+ return getSegmentProjectTrack(
|
|
|
+ opts.ProjectScopedTrackOpts,
|
|
|
+ getDefaultSegmentTrack(additionalProps, ClusterConnectionStart),
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+// ClusterConnectionSuccessTrackOpts are the options for creating a track when a cluster
|
|
|
+// connection has finished
|
|
|
+type ClusterConnectionSuccessTrackOpts struct {
|
|
|
+ *ClusterScopedTrackOpts
|
|
|
+
|
|
|
+ ClusterCandidateID uint
|
|
|
+}
|
|
|
+
|
|
|
+// ClusterConnectionSuccessTrack returns a new track for when a cluster
|
|
|
+// connection has finished
|
|
|
+func ClusterConnectionSuccessTrack(opts *ClusterConnectionSuccessTrackOpts) segmentTrack {
|
|
|
+ additionalProps := make(map[string]interface{})
|
|
|
+ additionalProps["cc_id"] = opts.ClusterCandidateID
|
|
|
+
|
|
|
+ return getSegmentClusterTrack(
|
|
|
+ opts.ClusterScopedTrackOpts,
|
|
|
+ getDefaultSegmentTrack(additionalProps, ClusterConnectionSuccess),
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+// RegistryConnectionStartTrackOpts are the options for creating a track when a registry
|
|
|
+// connection has started
|
|
|
+type RegistryConnectionStartTrackOpts struct {
|
|
|
+ // note that this is a project-scoped track, since the cluster has not been created yet
|
|
|
+ *ProjectScopedTrackOpts
|
|
|
+
|
|
|
+ // a random id assigned to this connection request
|
|
|
+ FlowID string
|
|
|
}
|
|
|
|
|
|
-func (t *segmentNewClusterEventTrack) getUserId() string {
|
|
|
- return t.userId
|
|
|
+// RegistryConnectionStartTrack returns a new track for when a registry
|
|
|
+// connection has started
|
|
|
+func RegistryConnectionStartTrack(opts *RegistryConnectionStartTrackOpts) segmentTrack {
|
|
|
+ additionalProps := make(map[string]interface{})
|
|
|
+ additionalProps["flow_id"] = opts.FlowID
|
|
|
+
|
|
|
+ return getSegmentProjectTrack(
|
|
|
+ opts.ProjectScopedTrackOpts,
|
|
|
+ getDefaultSegmentTrack(additionalProps, RegistryConnectionStart),
|
|
|
+ )
|
|
|
}
|
|
|
|
|
|
-func (t *segmentNewClusterEventTrack) getEvent() SegmentEvent {
|
|
|
- return NewClusterEvent
|
|
|
+// RegistryConnectionSuccessTrackOpts are the options for creating a track when a registry
|
|
|
+// connection has completed
|
|
|
+type RegistryConnectionSuccessTrackOpts struct {
|
|
|
+ *RegistryScopedTrackOpts
|
|
|
+
|
|
|
+ // a random id assigned to this connection request
|
|
|
+ FlowID string
|
|
|
}
|
|
|
|
|
|
-func (t *segmentNewClusterEventTrack) getProperties() segment.Properties {
|
|
|
- return segment.NewProperties().Set("Project ID", t.projId).Set("Cluster Name", t.clusterName).Set("Cluster Type", t.clusterType).Set("Event Type", t.eventType)
|
|
|
+// RegistryConnectionSuccessTrack returns a new track for when a registry
|
|
|
+// connection has completed
|
|
|
+func RegistryConnectionSuccessTrack(opts *RegistryConnectionSuccessTrackOpts) segmentTrack {
|
|
|
+ additionalProps := make(map[string]interface{})
|
|
|
+ additionalProps["flow_id"] = opts.FlowID
|
|
|
+
|
|
|
+ return getSegmentRegistryTrack(
|
|
|
+ opts.RegistryScopedTrackOpts,
|
|
|
+ getDefaultSegmentTrack(additionalProps, RegistryConnectionSuccess),
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+// GithubConnectionStartTrackOpts are the options for creating a track when a github account
|
|
|
+// connection has started
|
|
|
+type GithubConnectionStartTrackOpts struct {
|
|
|
+ // note that this is a user-scoped track, since github repos are tied to the user
|
|
|
+ *UserScopedTrackOpts
|
|
|
+}
|
|
|
+
|
|
|
+// GithubConnectionStartTrack returns a new track for when a github account
|
|
|
+// connection has started
|
|
|
+func GithubConnectionStartTrack(opts *GithubConnectionStartTrackOpts) segmentTrack {
|
|
|
+ additionalProps := make(map[string]interface{})
|
|
|
+
|
|
|
+ return getSegmentUserTrack(
|
|
|
+ opts.UserScopedTrackOpts,
|
|
|
+ getDefaultSegmentTrack(additionalProps, GithubConnectionStart),
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+// GithubConnectionSuccessTrackOpts are the options for creating a track when a github account
|
|
|
+// connection has completed
|
|
|
+type GithubConnectionSuccessTrackOpts struct {
|
|
|
+ // note that this is a user-scoped track, since github repos are tied to the user
|
|
|
+ *UserScopedTrackOpts
|
|
|
+}
|
|
|
+
|
|
|
+// GithubConnectionSuccessTrack returns a new track when a github account
|
|
|
+// connection has completed
|
|
|
+func GithubConnectionSuccessTrack(opts *GithubConnectionSuccessTrackOpts) segmentTrack {
|
|
|
+ additionalProps := make(map[string]interface{})
|
|
|
+
|
|
|
+ return getSegmentUserTrack(
|
|
|
+ opts.UserScopedTrackOpts,
|
|
|
+ getDefaultSegmentTrack(additionalProps, GithubConnectionSuccess),
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+// ApplicationLaunchStartTrackOpts are the options for creating a track when an application
|
|
|
+// launch has started
|
|
|
+type ApplicationLaunchStartTrackOpts struct {
|
|
|
+ *ClusterScopedTrackOpts
|
|
|
+
|
|
|
+ FlowID string
|
|
|
+}
|
|
|
+
|
|
|
+// ApplicationLaunchStartTrack returns a new track for when an application
|
|
|
+// launch has started
|
|
|
+func ApplicationLaunchStartTrack(opts *ApplicationLaunchStartTrackOpts) segmentTrack {
|
|
|
+ additionalProps := make(map[string]interface{})
|
|
|
+ additionalProps["flow_id"] = opts.FlowID
|
|
|
+
|
|
|
+ return getSegmentClusterTrack(
|
|
|
+ opts.ClusterScopedTrackOpts,
|
|
|
+ getDefaultSegmentTrack(additionalProps, ApplicationLaunchStart),
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+// ApplicationLaunchSuccessTrackOpts are the options for creating a track when an application
|
|
|
+// launch has completed
|
|
|
+type ApplicationLaunchSuccessTrackOpts struct {
|
|
|
+ *ApplicationScopedTrackOpts
|
|
|
+
|
|
|
+ FlowID string
|
|
|
+}
|
|
|
+
|
|
|
+// ApplicationLaunchSuccessTrack returns a new track for when an application
|
|
|
+// launch has completed
|
|
|
+func ApplicationLaunchSuccessTrack(opts *ApplicationLaunchSuccessTrackOpts) segmentTrack {
|
|
|
+ additionalProps := make(map[string]interface{})
|
|
|
+ additionalProps["flow_id"] = opts.FlowID
|
|
|
+
|
|
|
+ return getSegmentApplicationTrack(
|
|
|
+ opts.ApplicationScopedTrackOpts,
|
|
|
+ getDefaultSegmentTrack(additionalProps, ApplicationLaunchSuccess),
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+// ApplicationDeploymentWebhookTrackOpts are the options for creating a track when an application
|
|
|
+// launch has completed from a webhook
|
|
|
+type ApplicationDeploymentWebhookTrackOpts struct {
|
|
|
+ *ApplicationScopedTrackOpts
|
|
|
+
|
|
|
+ ImageURI string
|
|
|
+}
|
|
|
+
|
|
|
+// ApplicationDeploymentWebhookTrack returns a new track for when an application
|
|
|
+// launch has completed from a webhook
|
|
|
+func ApplicationDeploymentWebhookTrack(opts *ApplicationDeploymentWebhookTrackOpts) segmentTrack {
|
|
|
+ additionalProps := make(map[string]interface{})
|
|
|
+ additionalProps["image_uri"] = opts.ImageURI
|
|
|
+
|
|
|
+ return getSegmentApplicationTrack(
|
|
|
+ opts.ApplicationScopedTrackOpts,
|
|
|
+ getDefaultSegmentTrack(additionalProps, ApplicationDeploymentWebhook),
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+// RegistryProvisioningStartTrackOpts are the options for creating a track when a registry
|
|
|
+// provisioning has started
|
|
|
+type RegistryProvisioningStartTrackOpts struct {
|
|
|
+ // note that this is a project-scoped track, since the registry has not been created yet
|
|
|
+ *ProjectScopedTrackOpts
|
|
|
+
|
|
|
+ RegistryType models.InfraKind
|
|
|
+ InfraID uint
|
|
|
+}
|
|
|
+
|
|
|
+// RegistryProvisioningStartTrack returns a new track for when a registry
|
|
|
+// provisioning has started
|
|
|
+func RegistryProvisioningStartTrack(opts *RegistryProvisioningStartTrackOpts) segmentTrack {
|
|
|
+ additionalProps := make(map[string]interface{})
|
|
|
+ additionalProps["registry_type"] = opts.RegistryType
|
|
|
+ additionalProps["infra_id"] = opts.InfraID
|
|
|
+
|
|
|
+ return getSegmentProjectTrack(
|
|
|
+ opts.ProjectScopedTrackOpts,
|
|
|
+ getDefaultSegmentTrack(additionalProps, RegistryProvisioningStart),
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+// RegistryProvisioningErrorTrackOpts are the options for creating a track when a registry
|
|
|
+// provisioning has failed
|
|
|
+type RegistryProvisioningErrorTrackOpts struct {
|
|
|
+ // note that this is a project-scoped track, since the registry has not been created yet
|
|
|
+ *ProjectScopedTrackOpts
|
|
|
+
|
|
|
+ RegistryType models.InfraKind
|
|
|
+ InfraID uint
|
|
|
+}
|
|
|
+
|
|
|
+// RegistryProvisioningErrorTrack returns a new track for when a registry
|
|
|
+// provisioning has failed
|
|
|
+func RegistryProvisioningErrorTrack(opts *RegistryProvisioningErrorTrackOpts) segmentTrack {
|
|
|
+ additionalProps := make(map[string]interface{})
|
|
|
+ additionalProps["registry_type"] = opts.RegistryType
|
|
|
+ additionalProps["infra_id"] = opts.InfraID
|
|
|
+
|
|
|
+ return getSegmentProjectTrack(
|
|
|
+ opts.ProjectScopedTrackOpts,
|
|
|
+ getDefaultSegmentTrack(additionalProps, RegistryProvisioningError),
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+// RegistryProvisioningSuccessTrackOpts are the options for creating a track when a registry
|
|
|
+// provisioning has completed
|
|
|
+type RegistryProvisioningSuccessTrackOpts struct {
|
|
|
+ *RegistryScopedTrackOpts
|
|
|
+
|
|
|
+ RegistryType models.InfraKind
|
|
|
+ InfraID uint
|
|
|
+}
|
|
|
+
|
|
|
+// RegistryProvisioningSuccessTrack returns a new track for when a registry
|
|
|
+// provisioning has completed
|
|
|
+func RegistryProvisioningSuccessTrack(opts *RegistryProvisioningSuccessTrackOpts) segmentTrack {
|
|
|
+ additionalProps := make(map[string]interface{})
|
|
|
+ additionalProps["registry_type"] = opts.RegistryType
|
|
|
+ additionalProps["infra_id"] = opts.InfraID
|
|
|
+
|
|
|
+ return getSegmentRegistryTrack(
|
|
|
+ opts.RegistryScopedTrackOpts,
|
|
|
+ getDefaultSegmentTrack(additionalProps, RegistryProvisioningSuccess),
|
|
|
+ )
|
|
|
}
|