tracks.go 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161
  1. package analytics
  2. import (
  3. "github.com/porter-dev/porter/api/types"
  4. segment "gopkg.in/segmentio/analytics-go.v3"
  5. )
  6. type segmentTrack interface {
  7. getUserId() string
  8. getEvent() SegmentEvent
  9. getProperties() segment.Properties
  10. }
  11. type defaultTrackOpts struct {
  12. AdditionalProps map[string]interface{}
  13. }
  14. type defaultSegmentTrack struct {
  15. event SegmentEvent
  16. properties segmentProperties
  17. }
  18. func getDefaultSegmentTrack(additionalProps map[string]interface{}, event SegmentEvent) *defaultSegmentTrack {
  19. props := newSegmentProperties()
  20. props.addAdditionalProperties(additionalProps)
  21. return &defaultSegmentTrack{
  22. event: event,
  23. properties: props,
  24. }
  25. }
  26. func (t *defaultSegmentTrack) getEvent() SegmentEvent {
  27. return t.event
  28. }
  29. func (t *defaultSegmentTrack) getProperties() segment.Properties {
  30. props := segment.NewProperties()
  31. for key, val := range t.properties {
  32. props = props.Set(key, val)
  33. }
  34. return props
  35. }
  36. type segmentProperties map[string]interface{}
  37. func newSegmentProperties() segmentProperties {
  38. props := make(map[string]interface{})
  39. return props
  40. }
  41. func (p segmentProperties) addProjectProperties(opts *ProjectScopedTrackOpts) {
  42. p["proj_id"] = opts.ProjectID
  43. }
  44. func (p segmentProperties) addClusterProperties(opts *ClusterScopedTrackOpts) {
  45. p["cluster_id"] = opts.ClusterID
  46. }
  47. func (p segmentProperties) addRegistryProperties(opts *RegistryScopedTrackOpts) {
  48. p["registry_id"] = opts.RegistryID
  49. }
  50. func (p segmentProperties) addApplicationProperties(opts *ApplicationScopedTrackOpts) {
  51. p["app_name"] = opts.Name
  52. p["app_namespace"] = opts.Namespace
  53. p["chart_name"] = opts.ChartName
  54. }
  55. func (p segmentProperties) addAdditionalProperties(props map[string]interface{}) {
  56. for key, val := range props {
  57. p[key] = val
  58. }
  59. }
  60. // UserCreateTrackOpts are the options for creating a track when a user is created
  61. type UserCreateTrackOpts struct {
  62. *UserScopedTrackOpts
  63. Email string
  64. FirstName string
  65. LastName string
  66. CompanyName string
  67. ReferralMethod string
  68. }
  69. // UserCreateTrack returns a track for when a user is created
  70. func UserCreateTrack(opts *UserCreateTrackOpts) segmentTrack {
  71. additionalProps := make(map[string]interface{})
  72. additionalProps["email"] = opts.Email
  73. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  74. additionalProps["company"] = opts.CompanyName
  75. additionalProps["referral_method"] = opts.ReferralMethod
  76. return getSegmentUserTrack(
  77. opts.UserScopedTrackOpts,
  78. getDefaultSegmentTrack(additionalProps, UserCreate),
  79. )
  80. }
  81. // UserCreateTrackOpts are the options for creating a track when a user's email is verified
  82. type UserVerifyEmailTrackOpts struct {
  83. *UserScopedTrackOpts
  84. Email string
  85. }
  86. // UserVerifyEmailTrack returns a track for when a user's email is verified
  87. func UserVerifyEmailTrack(opts *UserVerifyEmailTrackOpts) segmentTrack {
  88. additionalProps := make(map[string]interface{})
  89. additionalProps["email"] = opts.Email
  90. return getSegmentUserTrack(
  91. opts.UserScopedTrackOpts,
  92. getDefaultSegmentTrack(additionalProps, UserVerifyEmail),
  93. )
  94. }
  95. // ProjectCreateDeleteTrackOpts are the options for creating a track when a project is created or deleted
  96. type ProjectCreateDeleteTrackOpts struct {
  97. *ProjectScopedTrackOpts
  98. Email string
  99. FirstName string
  100. LastName string
  101. CompanyName string
  102. }
  103. // ProjectConnectTrack returns a track for when a project is connected
  104. func ProjectConnectTrack(opts *ProjectCreateDeleteTrackOpts) segmentTrack {
  105. additionalProps := make(map[string]interface{})
  106. additionalProps["email"] = opts.Email
  107. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  108. additionalProps["company"] = opts.CompanyName
  109. return getSegmentProjectTrack(
  110. opts.ProjectScopedTrackOpts,
  111. getDefaultSegmentTrack(additionalProps, ProjectConnect),
  112. )
  113. }
  114. // ProjectCreateTrack returns a track for when a project is created
  115. func ProjectCreateTrack(opts *ProjectCreateDeleteTrackOpts) segmentTrack {
  116. additionalProps := make(map[string]interface{})
  117. additionalProps["email"] = opts.Email
  118. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  119. additionalProps["company"] = opts.CompanyName
  120. return getSegmentProjectTrack(
  121. opts.ProjectScopedTrackOpts,
  122. getDefaultSegmentTrack(additionalProps, ProjectCreate),
  123. )
  124. }
  125. // ProjectDeleteTrack returns a track for when a project is deleted
  126. func ProjectDeleteTrack(opts *ProjectCreateDeleteTrackOpts) segmentTrack {
  127. additionalProps := make(map[string]interface{})
  128. additionalProps["email"] = opts.Email
  129. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  130. additionalProps["company"] = opts.CompanyName
  131. return getSegmentProjectTrack(
  132. opts.ProjectScopedTrackOpts,
  133. getDefaultSegmentTrack(additionalProps, ProjectDelete),
  134. )
  135. }
  136. // PaymentMethodCreateDeleteTrackOpts are the options for creating a track when a payment method is attached/detached
  137. type PaymentMethodCreateDeleteTrackOpts struct {
  138. *ProjectScopedTrackOpts
  139. Email string
  140. FirstName string
  141. LastName string
  142. CompanyName string
  143. }
  144. // PaymentMethodAttachedTrack returns a track for when a payment method is attached
  145. func PaymentMethodAttachedTrack(opts *PaymentMethodCreateDeleteTrackOpts) segmentTrack {
  146. additionalProps := make(map[string]interface{})
  147. additionalProps["email"] = opts.Email
  148. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  149. additionalProps["company"] = opts.CompanyName
  150. return getSegmentProjectTrack(
  151. opts.ProjectScopedTrackOpts,
  152. getDefaultSegmentTrack(additionalProps, PaymentMethodAttached),
  153. )
  154. }
  155. // PaymentMethodDettachedTrack returns a track for when a payment method is detached
  156. func PaymentMethodDettachedTrack(opts *PaymentMethodCreateDeleteTrackOpts) segmentTrack {
  157. additionalProps := make(map[string]interface{})
  158. additionalProps["email"] = opts.Email
  159. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  160. additionalProps["company"] = opts.CompanyName
  161. return getSegmentProjectTrack(
  162. opts.ProjectScopedTrackOpts,
  163. getDefaultSegmentTrack(additionalProps, PaymentMethodDettached),
  164. )
  165. }
  166. // ClusterDeleteTrackOpts are the options for creating a track when a cluster is deleted
  167. type ClusterDeleteTrackOpts struct {
  168. *ProjectScopedTrackOpts
  169. Email string
  170. FirstName string
  171. LastName string
  172. CompanyName string
  173. }
  174. // ClusterDeleteTrack returns a track for when a cluster is deleted
  175. func ClusterDeleteTrack(opts *ClusterDeleteTrackOpts) segmentTrack {
  176. additionalProps := make(map[string]interface{})
  177. additionalProps["email"] = opts.Email
  178. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  179. additionalProps["company"] = opts.CompanyName
  180. return getSegmentProjectTrack(
  181. opts.ProjectScopedTrackOpts,
  182. getDefaultSegmentTrack(additionalProps, ClusterDelete),
  183. )
  184. }
  185. // CostConsentOpenedTrackOpts are the options for creating a track when a user opens the cost consent
  186. type CostConsentOpenedTrackOpts struct {
  187. *UserScopedTrackOpts
  188. Provider string
  189. Email string
  190. FirstName string
  191. LastName string
  192. CompanyName string
  193. }
  194. // CostConsentCompletedTrack returns a track for when a user completes the cost consent
  195. func CostConsentOpenedTrack(opts *CostConsentOpenedTrackOpts) segmentTrack {
  196. additionalProps := make(map[string]interface{})
  197. additionalProps["provider"] = opts.Provider
  198. additionalProps["email"] = opts.Email
  199. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  200. additionalProps["company"] = opts.CompanyName
  201. return getSegmentUserTrack(
  202. opts.UserScopedTrackOpts,
  203. getDefaultSegmentTrack(additionalProps, CostConsentOpened),
  204. )
  205. }
  206. // CostConsentCompletedTrackOpts are the options for creating a track when a user completes the cost consent
  207. type CostConsentCompletedTrackOpts struct {
  208. *UserScopedTrackOpts
  209. Provider string
  210. Email string
  211. FirstName string
  212. LastName string
  213. CompanyName string
  214. }
  215. // CostConsentCompletedTrack returns a track for when a user completes the cost consent
  216. func CostConsentCompletedTrack(opts *CostConsentCompletedTrackOpts) segmentTrack {
  217. additionalProps := make(map[string]interface{})
  218. additionalProps["provider"] = opts.Provider
  219. additionalProps["email"] = opts.Email
  220. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  221. additionalProps["company"] = opts.CompanyName
  222. return getSegmentUserTrack(
  223. opts.UserScopedTrackOpts,
  224. getDefaultSegmentTrack(additionalProps, CostConsentComplete),
  225. )
  226. }
  227. // AWSInputTrackOpts are the options for creating a track when a user inputs a complete AWS account ID
  228. type AWSInputTrackOpts struct {
  229. *ProjectScopedTrackOpts
  230. Email string
  231. FirstName string
  232. LastName string
  233. CompanyName string
  234. AccountId string
  235. }
  236. // AWSInputTrack returns a track for when a user inputs a complete AWS account ID
  237. func AWSInputTrack(opts *AWSInputTrackOpts) segmentTrack {
  238. additionalProps := make(map[string]interface{})
  239. additionalProps["email"] = opts.Email
  240. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  241. additionalProps["company"] = opts.CompanyName
  242. additionalProps["account_id"] = opts.AccountId
  243. return getSegmentProjectTrack(
  244. opts.ProjectScopedTrackOpts,
  245. getDefaultSegmentTrack(additionalProps, AWSInputted),
  246. )
  247. }
  248. type AWSRedirectOpts struct {
  249. *ProjectScopedTrackOpts
  250. Email string
  251. FirstName string
  252. LastName string
  253. CompanyName string
  254. AccountId string
  255. CloudformationURL string
  256. LoginURL string
  257. ExternalId string
  258. }
  259. // AWSCloudformationRedirectSuccess returns a track for when a user clicks 'grant permissions' and gets redirected to cloudformation
  260. func AWSCloudformationRedirectSuccess(opts *AWSRedirectOpts) segmentTrack {
  261. additionalProps := make(map[string]interface{})
  262. additionalProps["email"] = opts.Email
  263. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  264. additionalProps["company"] = opts.CompanyName
  265. additionalProps["account_id"] = opts.AccountId
  266. additionalProps["cloudformation_url"] = opts.CloudformationURL
  267. additionalProps["external_id"] = opts.ExternalId
  268. return getSegmentProjectTrack(
  269. opts.ProjectScopedTrackOpts,
  270. getDefaultSegmentTrack(additionalProps, AWSCloudformationRedirect),
  271. )
  272. }
  273. // AWSLoginRedirectSuccess returns a track for when a user is prompted to login to AWS
  274. func AWSLoginRedirectSuccess(opts *AWSRedirectOpts) segmentTrack {
  275. additionalProps := make(map[string]interface{})
  276. additionalProps["email"] = opts.Email
  277. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  278. additionalProps["company"] = opts.CompanyName
  279. additionalProps["account_id"] = opts.AccountId
  280. additionalProps["login_url"] = opts.LoginURL
  281. return getSegmentProjectTrack(
  282. opts.ProjectScopedTrackOpts,
  283. getDefaultSegmentTrack(additionalProps, AWSLoginRedirect),
  284. )
  285. }
  286. type AWSCreateIntegrationOpts struct {
  287. *ProjectScopedTrackOpts
  288. Email string
  289. FirstName string
  290. LastName string
  291. CompanyName string
  292. AccountId string
  293. ExternalId string
  294. ErrorMessage string
  295. }
  296. // AWSCreateIntegrationSucceeded returns a track for when a user succeeds in creating an aws integration
  297. func AWSCreateIntegrationSucceeded(opts *AWSCreateIntegrationOpts) segmentTrack {
  298. additionalProps := make(map[string]interface{})
  299. additionalProps["email"] = opts.Email
  300. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  301. additionalProps["company"] = opts.CompanyName
  302. additionalProps["account_id"] = opts.AccountId
  303. return getSegmentProjectTrack(
  304. opts.ProjectScopedTrackOpts,
  305. getDefaultSegmentTrack(additionalProps, AWSCreateIntegrationSuccess),
  306. )
  307. }
  308. // AWSCreateIntegrationSucceeded returns a track for when a user succeeds in creating an aws integration
  309. func AWSCreateIntegrationFailed(opts *AWSCreateIntegrationOpts) segmentTrack {
  310. additionalProps := make(map[string]interface{})
  311. additionalProps["email"] = opts.Email
  312. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  313. additionalProps["company"] = opts.CompanyName
  314. additionalProps["account_id"] = opts.AccountId
  315. additionalProps["error_message"] = opts.ErrorMessage
  316. additionalProps["external_id"] = opts.ExternalId
  317. return getSegmentProjectTrack(
  318. opts.ProjectScopedTrackOpts,
  319. getDefaultSegmentTrack(additionalProps, AWSCreateIntegrationFailure),
  320. )
  321. }
  322. // CredentialStepTrackOpts are the options for creating a track when a user completes the credential step
  323. type CredentialStepTrackOpts struct {
  324. *UserScopedTrackOpts
  325. }
  326. // CredentialStepTrack returns a track for when a user completes the credential step
  327. func CredentialStepTrack(opts *CredentialStepTrackOpts) segmentTrack {
  328. additionalProps := make(map[string]interface{})
  329. return getSegmentUserTrack(
  330. opts.UserScopedTrackOpts,
  331. getDefaultSegmentTrack(additionalProps, CredentialStepComplete),
  332. )
  333. }
  334. // PreProvisionCheckTrackOpts are the options for creating a track when a user checks if they can provision
  335. type PreProvisionCheckTrackOpts struct {
  336. *ProjectScopedTrackOpts
  337. Email string
  338. FirstName string
  339. LastName string
  340. CompanyName string
  341. }
  342. // PreProvisionCheckTrack returns a track for when a user attempts provisioning
  343. func PreProvisionCheckTrack(opts *PreProvisionCheckTrackOpts) segmentTrack {
  344. additionalProps := make(map[string]interface{})
  345. additionalProps["email"] = opts.Email
  346. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  347. additionalProps["company"] = opts.CompanyName
  348. return getSegmentProjectTrack(
  349. opts.ProjectScopedTrackOpts,
  350. getDefaultSegmentTrack(additionalProps, PreProvisionCheck),
  351. )
  352. }
  353. // ProvisioningAttemptedTrackOpts are the options for creating a track when a user attempts provisioning
  354. type ProvisioningAttemptTrackOpts struct {
  355. *ProjectScopedTrackOpts
  356. Email string
  357. FirstName string
  358. LastName string
  359. CompanyName string
  360. ErrorMessage string
  361. Region string
  362. Provider string
  363. }
  364. // ProvisioningAttemptTrack returns a track for when a user attempts provisioning
  365. func ProvisioningAttemptTrack(opts *ProvisioningAttemptTrackOpts) segmentTrack {
  366. additionalProps := make(map[string]interface{})
  367. additionalProps["email"] = opts.Email
  368. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  369. additionalProps["company"] = opts.CompanyName
  370. additionalProps["region"] = opts.Region
  371. additionalProps["provider"] = opts.Provider
  372. return getSegmentProjectTrack(
  373. opts.ProjectScopedTrackOpts,
  374. getDefaultSegmentTrack(additionalProps, ProvisioningAttempted),
  375. )
  376. }
  377. // QuotaIncreaseAttemptTrack returns a track for when a user attempts provisioning
  378. func QuotaIncreaseAttemptTrack(opts *ProvisioningAttemptTrackOpts) segmentTrack {
  379. additionalProps := make(map[string]interface{})
  380. additionalProps["email"] = opts.Email
  381. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  382. additionalProps["company"] = opts.CompanyName
  383. additionalProps["region"] = opts.Region
  384. additionalProps["provider"] = opts.Provider
  385. return getSegmentProjectTrack(
  386. opts.ProjectScopedTrackOpts,
  387. getDefaultSegmentTrack(additionalProps, QuotaIncreaseRequested),
  388. )
  389. }
  390. // PreProvisionCheckTrack returns a track for when a user attempts provisioning
  391. func ProvisionFailureTrack(opts *ProvisioningAttemptTrackOpts) segmentTrack {
  392. additionalProps := make(map[string]interface{})
  393. additionalProps["email"] = opts.Email
  394. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  395. additionalProps["company"] = opts.CompanyName
  396. additionalProps["error_message"] = opts.ErrorMessage
  397. additionalProps["region"] = opts.Region
  398. return getSegmentProjectTrack(
  399. opts.ProjectScopedTrackOpts,
  400. getDefaultSegmentTrack(additionalProps, ProvisioningFailure),
  401. )
  402. }
  403. // ClusterProvisioningStartTrackOpts are the options for creating a track when a cluster
  404. // has started provisioning
  405. type ClusterProvisioningStartTrackOpts struct {
  406. // note that this is a project-scoped track, since the cluster has not been created yet
  407. *ProjectScopedTrackOpts
  408. ClusterType types.InfraKind
  409. InfraID uint
  410. }
  411. // ClusterProvisioningStartTrack returns a track for when a cluster
  412. // has started provisioning
  413. func ClusterProvisioningStartTrack(opts *ClusterProvisioningStartTrackOpts) segmentTrack {
  414. additionalProps := make(map[string]interface{})
  415. additionalProps["cluster_type"] = opts.ClusterType
  416. additionalProps["infra_id"] = opts.InfraID
  417. return getSegmentProjectTrack(
  418. opts.ProjectScopedTrackOpts,
  419. getDefaultSegmentTrack(additionalProps, ClusterProvisioningStart),
  420. )
  421. }
  422. // ClusterProvisioningErrorTrackOpts are the options for creating a track when a cluster
  423. // has experienced a provisioning error
  424. type ClusterProvisioningErrorTrackOpts struct {
  425. // note that this is a project-scoped track, since the cluster has not been created yet
  426. *ProjectScopedTrackOpts
  427. ClusterType types.InfraKind
  428. InfraID uint
  429. }
  430. // ClusterProvisioningErrorTrack returns a track for when a cluster
  431. // has experienced a provisioning error
  432. func ClusterProvisioningErrorTrack(opts *ClusterProvisioningErrorTrackOpts) segmentTrack {
  433. additionalProps := make(map[string]interface{})
  434. additionalProps["cluster_type"] = opts.ClusterType
  435. additionalProps["infra_id"] = opts.InfraID
  436. return getSegmentProjectTrack(
  437. opts.ProjectScopedTrackOpts,
  438. getDefaultSegmentTrack(additionalProps, ClusterProvisioningError),
  439. )
  440. }
  441. // ClusterProvisioningSuccessTrackOpts are the options for creating a track when a cluster
  442. // has successfully provisioned
  443. type ClusterProvisioningSuccessTrackOpts struct {
  444. *ClusterScopedTrackOpts
  445. ClusterType types.InfraKind
  446. InfraID uint
  447. }
  448. // ClusterProvisioningSuccessTrack returns a new track for when a cluster
  449. // has successfully provisioned
  450. func ClusterProvisioningSuccessTrack(opts *ClusterProvisioningSuccessTrackOpts) segmentTrack {
  451. additionalProps := make(map[string]interface{})
  452. additionalProps["cluster_type"] = opts.ClusterType
  453. additionalProps["infra_id"] = opts.InfraID
  454. return getSegmentClusterTrack(
  455. opts.ClusterScopedTrackOpts,
  456. getDefaultSegmentTrack(additionalProps, ClusterProvisioningSuccess),
  457. )
  458. }
  459. // ClusterConnectionStartTrackOpts are the options for creating a track when a cluster
  460. // connection has started
  461. type ClusterConnectionStartTrackOpts struct {
  462. // note that this is a project-scoped track, since the cluster has not been created yet
  463. *ProjectScopedTrackOpts
  464. ClusterCandidateID uint
  465. }
  466. // ClusterConnectionStartTrack returns a new track for when a cluster
  467. // connection has started
  468. func ClusterConnectionStartTrack(opts *ClusterConnectionStartTrackOpts) segmentTrack {
  469. additionalProps := make(map[string]interface{})
  470. additionalProps["cc_id"] = opts.ClusterCandidateID
  471. return getSegmentProjectTrack(
  472. opts.ProjectScopedTrackOpts,
  473. getDefaultSegmentTrack(additionalProps, ClusterConnectionStart),
  474. )
  475. }
  476. // ClusterConnectionSuccessTrackOpts are the options for creating a track when a cluster
  477. // connection has finished
  478. type ClusterConnectionSuccessTrackOpts struct {
  479. *ClusterScopedTrackOpts
  480. ClusterCandidateID uint
  481. }
  482. // ClusterConnectionSuccessTrack returns a new track for when a cluster
  483. // connection has finished
  484. func ClusterConnectionSuccessTrack(opts *ClusterConnectionSuccessTrackOpts) segmentTrack {
  485. additionalProps := make(map[string]interface{})
  486. additionalProps["cc_id"] = opts.ClusterCandidateID
  487. return getSegmentClusterTrack(
  488. opts.ClusterScopedTrackOpts,
  489. getDefaultSegmentTrack(additionalProps, ClusterConnectionSuccess),
  490. )
  491. }
  492. // RegistryConnectionStartTrackOpts are the options for creating a track when a registry
  493. // connection has started
  494. type RegistryConnectionStartTrackOpts struct {
  495. // note that this is a project-scoped track, since the cluster has not been created yet
  496. *ProjectScopedTrackOpts
  497. // a random id assigned to this connection request
  498. FlowID string
  499. }
  500. // RegistryConnectionStartTrack returns a new track for when a registry
  501. // connection has started
  502. func RegistryConnectionStartTrack(opts *RegistryConnectionStartTrackOpts) segmentTrack {
  503. additionalProps := make(map[string]interface{})
  504. additionalProps["flow_id"] = opts.FlowID
  505. return getSegmentProjectTrack(
  506. opts.ProjectScopedTrackOpts,
  507. getDefaultSegmentTrack(additionalProps, RegistryConnectionStart),
  508. )
  509. }
  510. // RegistryConnectionSuccessTrackOpts are the options for creating a track when a registry
  511. // connection has completed
  512. type RegistryConnectionSuccessTrackOpts struct {
  513. *RegistryScopedTrackOpts
  514. // a random id assigned to this connection request
  515. FlowID string
  516. }
  517. // RegistryConnectionSuccessTrack returns a new track for when a registry
  518. // connection has completed
  519. func RegistryConnectionSuccessTrack(opts *RegistryConnectionSuccessTrackOpts) segmentTrack {
  520. additionalProps := make(map[string]interface{})
  521. additionalProps["flow_id"] = opts.FlowID
  522. return getSegmentRegistryTrack(
  523. opts.RegistryScopedTrackOpts,
  524. getDefaultSegmentTrack(additionalProps, RegistryConnectionSuccess),
  525. )
  526. }
  527. // GithubConnectionStartTrackOpts are the options for creating a track when a github account
  528. // connection has started
  529. type GithubConnectionStartTrackOpts struct {
  530. // note that this is a user-scoped track, since github repos are tied to the user
  531. *UserScopedTrackOpts
  532. }
  533. // GithubConnectionStartTrack returns a new track for when a github account
  534. // connection has started
  535. func GithubConnectionStartTrack(opts *GithubConnectionStartTrackOpts) segmentTrack {
  536. additionalProps := make(map[string]interface{})
  537. return getSegmentUserTrack(
  538. opts.UserScopedTrackOpts,
  539. getDefaultSegmentTrack(additionalProps, GithubConnectionStart),
  540. )
  541. }
  542. // GithubConnectionSuccessTrackOpts are the options for creating a track when a github account
  543. // connection has completed
  544. type GithubConnectionSuccessTrackOpts struct {
  545. // note that this is a user-scoped track, since github repos are tied to the user
  546. *UserScopedTrackOpts
  547. }
  548. // GithubConnectionSuccessTrack returns a new track when a github account
  549. // connection has completed
  550. func GithubConnectionSuccessTrack(opts *GithubConnectionSuccessTrackOpts) segmentTrack {
  551. additionalProps := make(map[string]interface{})
  552. return getSegmentUserTrack(
  553. opts.UserScopedTrackOpts,
  554. getDefaultSegmentTrack(additionalProps, GithubConnectionSuccess),
  555. )
  556. }
  557. // ApplicationLaunchStartTrackOpts are the options for creating a track when an application
  558. // launch has started
  559. type ApplicationLaunchStartTrackOpts struct {
  560. *ClusterScopedTrackOpts
  561. FlowID string
  562. }
  563. // ApplicationLaunchStartTrack returns a new track for when an application
  564. // launch has started
  565. func ApplicationLaunchStartTrack(opts *ApplicationLaunchStartTrackOpts) segmentTrack {
  566. additionalProps := make(map[string]interface{})
  567. additionalProps["flow_id"] = opts.FlowID
  568. return getSegmentClusterTrack(
  569. opts.ClusterScopedTrackOpts,
  570. getDefaultSegmentTrack(additionalProps, ApplicationLaunchStart),
  571. )
  572. }
  573. // ApplicationLaunchSuccessTrackOpts are the options for creating a track when an application
  574. // launch has completed
  575. type ApplicationLaunchSuccessTrackOpts struct {
  576. *ApplicationScopedTrackOpts
  577. FlowID string
  578. }
  579. // ApplicationLaunchSuccessTrack returns a new track for when an application
  580. // launch has completed
  581. func ApplicationLaunchSuccessTrack(opts *ApplicationLaunchSuccessTrackOpts) segmentTrack {
  582. additionalProps := make(map[string]interface{})
  583. additionalProps["flow_id"] = opts.FlowID
  584. return getSegmentApplicationTrack(
  585. opts.ApplicationScopedTrackOpts,
  586. getDefaultSegmentTrack(additionalProps, ApplicationLaunchSuccess),
  587. )
  588. }
  589. // ApplicationDeploymentWebhookTrackOpts are the options for creating a track when an application
  590. // launch has completed from a webhook
  591. type ApplicationDeploymentWebhookTrackOpts struct {
  592. *ApplicationScopedTrackOpts
  593. ImageURI string
  594. }
  595. // ApplicationDeploymentWebhookTrack returns a new track for when an application
  596. // launch has completed from a webhook
  597. func ApplicationDeploymentWebhookTrack(opts *ApplicationDeploymentWebhookTrackOpts) segmentTrack {
  598. additionalProps := make(map[string]interface{})
  599. additionalProps["image_uri"] = opts.ImageURI
  600. return getSegmentApplicationTrack(
  601. opts.ApplicationScopedTrackOpts,
  602. getDefaultSegmentTrack(additionalProps, ApplicationDeploymentWebhook),
  603. )
  604. }
  605. // RegistryProvisioningStartTrackOpts are the options for creating a track when a registry
  606. // provisioning has started
  607. type RegistryProvisioningStartTrackOpts struct {
  608. // note that this is a project-scoped track, since the registry has not been created yet
  609. *ProjectScopedTrackOpts
  610. RegistryType types.InfraKind
  611. InfraID uint
  612. }
  613. // RegistryProvisioningStartTrack returns a new track for when a registry
  614. // provisioning has started
  615. func RegistryProvisioningStartTrack(opts *RegistryProvisioningStartTrackOpts) segmentTrack {
  616. additionalProps := make(map[string]interface{})
  617. additionalProps["registry_type"] = opts.RegistryType
  618. additionalProps["infra_id"] = opts.InfraID
  619. return getSegmentProjectTrack(
  620. opts.ProjectScopedTrackOpts,
  621. getDefaultSegmentTrack(additionalProps, RegistryProvisioningStart),
  622. )
  623. }
  624. // RegistryProvisioningErrorTrackOpts are the options for creating a track when a registry
  625. // provisioning has failed
  626. type RegistryProvisioningErrorTrackOpts struct {
  627. // note that this is a project-scoped track, since the registry has not been created yet
  628. *ProjectScopedTrackOpts
  629. RegistryType types.InfraKind
  630. InfraID uint
  631. }
  632. // RegistryProvisioningErrorTrack returns a new track for when a registry
  633. // provisioning has failed
  634. func RegistryProvisioningErrorTrack(opts *RegistryProvisioningErrorTrackOpts) segmentTrack {
  635. additionalProps := make(map[string]interface{})
  636. additionalProps["registry_type"] = opts.RegistryType
  637. additionalProps["infra_id"] = opts.InfraID
  638. return getSegmentProjectTrack(
  639. opts.ProjectScopedTrackOpts,
  640. getDefaultSegmentTrack(additionalProps, RegistryProvisioningError),
  641. )
  642. }
  643. // RegistryProvisioningSuccessTrackOpts are the options for creating a track when a registry
  644. // provisioning has completed
  645. type RegistryProvisioningSuccessTrackOpts struct {
  646. *RegistryScopedTrackOpts
  647. RegistryType types.InfraKind
  648. InfraID uint
  649. }
  650. // RegistryProvisioningSuccessTrack returns a new track for when a registry
  651. // provisioning has completed
  652. func RegistryProvisioningSuccessTrack(opts *RegistryProvisioningSuccessTrackOpts) segmentTrack {
  653. additionalProps := make(map[string]interface{})
  654. additionalProps["registry_type"] = opts.RegistryType
  655. additionalProps["infra_id"] = opts.InfraID
  656. return getSegmentRegistryTrack(
  657. opts.RegistryScopedTrackOpts,
  658. getDefaultSegmentTrack(additionalProps, RegistryProvisioningSuccess),
  659. )
  660. }
  661. // ClusterDestroyingStartTrackOpts are the options for creating a track when a cluster
  662. // has started destroying
  663. type ClusterDestroyingStartTrackOpts struct {
  664. *ClusterScopedTrackOpts
  665. ClusterType types.InfraKind
  666. InfraID uint
  667. }
  668. // ClusterDestroyingStartTrack returns a track for when a cluster
  669. // has started destroying
  670. func ClusterDestroyingStartTrack(opts *ClusterDestroyingStartTrackOpts) segmentTrack {
  671. additionalProps := make(map[string]interface{})
  672. additionalProps["cluster_type"] = opts.ClusterType
  673. additionalProps["infra_id"] = opts.InfraID
  674. return getSegmentClusterTrack(
  675. opts.ClusterScopedTrackOpts,
  676. getDefaultSegmentTrack(additionalProps, ClusterDestroyingStart),
  677. )
  678. }
  679. // ClusterDestroyingSuccessTrackOpts are the options for creating a track when a cluster
  680. // has successfully provisioned
  681. type ClusterDestroyingSuccessTrackOpts struct {
  682. *ClusterScopedTrackOpts
  683. ClusterType types.InfraKind
  684. InfraID uint
  685. }
  686. // ClusterDestroyingSuccessTrack returns a new track for when a cluster
  687. // has successfully provisioned
  688. func ClusterDestroyingSuccessTrack(opts *ClusterDestroyingSuccessTrackOpts) segmentTrack {
  689. additionalProps := make(map[string]interface{})
  690. additionalProps["cluster_type"] = opts.ClusterType
  691. additionalProps["infra_id"] = opts.InfraID
  692. return getSegmentClusterTrack(
  693. opts.ClusterScopedTrackOpts,
  694. getDefaultSegmentTrack(additionalProps, ClusterDestroyingSuccess),
  695. )
  696. }
  697. // StackLaunchStartOpts are the options for creating a track when a user starts creating a stack
  698. type StackLaunchStartOpts struct {
  699. *ProjectScopedTrackOpts
  700. Email string
  701. FirstName string
  702. LastName string
  703. CompanyName string
  704. ValidateApplyV2 bool
  705. }
  706. // StackLaunchStartTrack returns a track for when a user starts creating a stack
  707. func StackLaunchStartTrack(opts *StackLaunchStartOpts) segmentTrack {
  708. additionalProps := make(map[string]interface{})
  709. additionalProps["email"] = opts.Email
  710. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  711. additionalProps["company"] = opts.CompanyName
  712. additionalProps["validate_apply_v2"] = opts.ValidateApplyV2
  713. return getSegmentProjectTrack(
  714. opts.ProjectScopedTrackOpts,
  715. getDefaultSegmentTrack(additionalProps, StackLaunchStart),
  716. )
  717. }
  718. // StackLaunchCompleteOpts are the options for creating a track when a user completes creating a stack
  719. type StackLaunchCompleteOpts struct {
  720. *ProjectScopedTrackOpts
  721. StackName string
  722. Email string
  723. FirstName string
  724. LastName string
  725. CompanyName string
  726. ValidateApplyV2 bool
  727. }
  728. // StackLaunchCompleteTrack returns a track for when a user completes creating a stack
  729. func StackLaunchCompleteTrack(opts *StackLaunchCompleteOpts) segmentTrack {
  730. additionalProps := make(map[string]interface{})
  731. additionalProps["stack_name"] = opts.StackName
  732. additionalProps["email"] = opts.Email
  733. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  734. additionalProps["company"] = opts.CompanyName
  735. additionalProps["validate_apply_v2"] = opts.ValidateApplyV2
  736. return getSegmentProjectTrack(
  737. opts.ProjectScopedTrackOpts,
  738. getDefaultSegmentTrack(additionalProps, StackLaunchComplete),
  739. )
  740. }
  741. // StackLaunchSuccessOpts are the options for creating a track when a user succeeds in creating a stack
  742. type StackLaunchSuccessOpts struct {
  743. *ProjectScopedTrackOpts
  744. StackName string
  745. Email string
  746. FirstName string
  747. LastName string
  748. CompanyName string
  749. ValidateApplyV2 bool
  750. }
  751. // StackLaunchCompleteTrack returns a track for when a user completes creating a stack
  752. func StackLaunchSuccessTrack(opts *StackLaunchSuccessOpts) segmentTrack {
  753. additionalProps := make(map[string]interface{})
  754. additionalProps["stack_name"] = opts.StackName
  755. additionalProps["email"] = opts.Email
  756. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  757. additionalProps["company"] = opts.CompanyName
  758. additionalProps["validate_apply_v2"] = opts.ValidateApplyV2
  759. return getSegmentProjectTrack(
  760. opts.ProjectScopedTrackOpts,
  761. getDefaultSegmentTrack(additionalProps, StackLaunchSuccess),
  762. )
  763. }
  764. // StackLaunchFailureOpts are the options for creating a track when a user fails in creating a stack
  765. type StackLaunchFailureOpts struct {
  766. *ProjectScopedTrackOpts
  767. StackName string
  768. Email string
  769. FirstName string
  770. LastName string
  771. CompanyName string
  772. ErrorMessage string
  773. ValidateApplyV2 bool
  774. }
  775. // StackLaunchFailureTrack returns a track for when a user fails creating a stack
  776. func StackLaunchFailureTrack(opts *StackLaunchFailureOpts) segmentTrack {
  777. additionalProps := make(map[string]interface{})
  778. additionalProps["stack_name"] = opts.StackName
  779. additionalProps["email"] = opts.Email
  780. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  781. additionalProps["company"] = opts.CompanyName
  782. additionalProps["error_message"] = opts.ErrorMessage
  783. additionalProps["validate_apply_v2"] = opts.ValidateApplyV2
  784. return getSegmentProjectTrack(
  785. opts.ProjectScopedTrackOpts,
  786. getDefaultSegmentTrack(additionalProps, StackLaunchFailure),
  787. )
  788. }
  789. // StackDeletionOpts are the options for creating a track when a user deletes a stack
  790. type StackDeletionOpts struct {
  791. *ProjectScopedTrackOpts
  792. StackName string
  793. Email string
  794. FirstName string
  795. LastName string
  796. CompanyName string
  797. DeleteWorkflowFile bool
  798. ValidateApplyV2 bool
  799. }
  800. // StackDeletionTrack returns a track for when a user deletes a stack
  801. func StackDeletionTrack(opts *StackDeletionOpts) segmentTrack {
  802. additionalProps := make(map[string]interface{})
  803. additionalProps["stack_name"] = opts.StackName
  804. additionalProps["email"] = opts.Email
  805. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  806. additionalProps["company"] = opts.CompanyName
  807. additionalProps["delete_workflow_file"] = opts.DeleteWorkflowFile
  808. additionalProps["validate_apply_v2"] = opts.ValidateApplyV2
  809. return getSegmentProjectTrack(
  810. opts.ProjectScopedTrackOpts,
  811. getDefaultSegmentTrack(additionalProps, StackDeletion),
  812. )
  813. }
  814. // StackBuildOpts are the options for creating a track when a stack builds
  815. type StackBuildOpts struct {
  816. *ProjectScopedTrackOpts
  817. StackName string
  818. ErrorMessage string
  819. B64BuildLogs string
  820. Email string
  821. FirstName string
  822. LastName string
  823. CompanyName string
  824. ValidateApplyV2 bool
  825. }
  826. // StackBuildFailureTrack returns a track for when a stack fails to build
  827. func StackBuildFailureTrack(opts *StackBuildOpts) segmentTrack {
  828. additionalProps := make(map[string]interface{})
  829. additionalProps["stack_name"] = opts.StackName
  830. additionalProps["error_message"] = opts.ErrorMessage
  831. additionalProps["email"] = opts.Email
  832. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  833. additionalProps["company"] = opts.CompanyName
  834. additionalProps["validate_apply_v2"] = opts.ValidateApplyV2
  835. additionalProps["b64_build_logs"] = opts.B64BuildLogs
  836. return getSegmentProjectTrack(
  837. opts.ProjectScopedTrackOpts,
  838. getDefaultSegmentTrack(additionalProps, StackBuildFailure),
  839. )
  840. }
  841. // StackBuildSuccessTrack returns a track for when a stack succeeds to build
  842. func StackBuildSuccessTrack(opts *StackBuildOpts) segmentTrack {
  843. additionalProps := make(map[string]interface{})
  844. additionalProps["stack_name"] = opts.StackName
  845. additionalProps["email"] = opts.Email
  846. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  847. additionalProps["company"] = opts.CompanyName
  848. additionalProps["validate_apply_v2"] = opts.ValidateApplyV2
  849. return getSegmentProjectTrack(
  850. opts.ProjectScopedTrackOpts,
  851. getDefaultSegmentTrack(additionalProps, StackBuildSuccess),
  852. )
  853. }
  854. // StackBuildProgressingTrack returns a track for when a stack starts to build
  855. func StackBuildProgressingTrack(opts *StackBuildOpts) segmentTrack {
  856. additionalProps := make(map[string]interface{})
  857. additionalProps["stack_name"] = opts.StackName
  858. additionalProps["email"] = opts.Email
  859. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  860. additionalProps["company"] = opts.CompanyName
  861. additionalProps["validate_apply_v2"] = opts.ValidateApplyV2
  862. return getSegmentProjectTrack(
  863. opts.ProjectScopedTrackOpts,
  864. getDefaultSegmentTrack(additionalProps, StackBuildProgressing),
  865. )
  866. }
  867. // PorterAppUpdateOpts are the options for creating a track when a user updates a porter app
  868. type PorterAppUpdateOpts struct {
  869. *ProjectScopedTrackOpts
  870. StackName string
  871. Email string
  872. FirstName string
  873. LastName string
  874. CompanyName string
  875. ErrorMessage string
  876. ErrorStackTrace string
  877. ValidateApplyV2 bool
  878. }
  879. // PorterAppUpdateFailureTrack returns a track for when a user attempts to update an app and receives an error
  880. func PorterAppUpdateFailureTrack(opts *PorterAppUpdateOpts) segmentTrack {
  881. additionalProps := make(map[string]interface{})
  882. additionalProps["stack_name"] = opts.StackName
  883. additionalProps["email"] = opts.Email
  884. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  885. additionalProps["company"] = opts.CompanyName
  886. additionalProps["error_message"] = opts.ErrorMessage
  887. additionalProps["error_stack_trace"] = opts.ErrorStackTrace
  888. additionalProps["validate_apply_v2"] = opts.ValidateApplyV2
  889. return getSegmentProjectTrack(
  890. opts.ProjectScopedTrackOpts,
  891. getDefaultSegmentTrack(additionalProps, PorterAppUpdateFailure),
  892. )
  893. }
  894. // CloudProviderPermissionsGrantedTrackOpts are the options for creating a track when a user grants permission to use porter
  895. type CloudProviderPermissionsGrantedTrackOpts struct {
  896. *ProjectScopedTrackOpts
  897. Email string
  898. FirstName string
  899. LastName string
  900. CompanyName string
  901. CloudProvider string
  902. CloudProviderCredentialIdentifier string
  903. }
  904. // CloudProviderPermissionsGrantedTrack returns a track for when a user grants permission to use porter
  905. func CloudProviderPermissionsGrantedTrack(opts *CloudProviderPermissionsGrantedTrackOpts) segmentTrack {
  906. additionalProps := make(map[string]interface{})
  907. additionalProps["email"] = opts.Email
  908. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  909. additionalProps["company"] = opts.CompanyName
  910. additionalProps["cloud_provider"] = opts.CloudProvider
  911. additionalProps["cloud_provider_credential_identifier"] = opts.CloudProviderCredentialIdentifier
  912. return getSegmentProjectTrack(
  913. opts.ProjectScopedTrackOpts,
  914. getDefaultSegmentTrack(additionalProps, CloudProviderPermissionsGranted),
  915. )
  916. }
  917. // ClusterPreflightChecksFailedTrackOpts are the options for creating a track when a user fails preflight checks
  918. type ClusterPreflightChecksFailedTrackOpts struct {
  919. *ProjectScopedTrackOpts
  920. Email string
  921. FirstName string
  922. LastName string
  923. CompanyName string
  924. ErrorMessage string
  925. ClusterName string
  926. CloudProvider string
  927. }
  928. // ClusterPreflightChecksFailedTrack returns a track for when a user fails preflight checks
  929. func ClusterPreflightChecksFailedTrack(opts *ClusterPreflightChecksFailedTrackOpts) segmentTrack {
  930. additionalProps := make(map[string]interface{})
  931. additionalProps["email"] = opts.Email
  932. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  933. additionalProps["company"] = opts.CompanyName
  934. additionalProps["error_message"] = opts.ErrorMessage
  935. additionalProps["cluster_name"] = opts.ClusterName
  936. additionalProps["cloud_provider"] = opts.CloudProvider
  937. return getSegmentProjectTrack(
  938. opts.ProjectScopedTrackOpts,
  939. getDefaultSegmentTrack(additionalProps, ClusterPreflightChecksFailed),
  940. )
  941. }
  942. // ClusterUpdateFailedTrackOpts are the options for creating a track when a user fails to update a cluster
  943. type ClusterUpdateFailedTrackOpts struct {
  944. *ProjectScopedTrackOpts
  945. ClusterName string
  946. Email string
  947. FirstName string
  948. LastName string
  949. CompanyName string
  950. ErrorMessage string
  951. CloudProvider string
  952. }
  953. // ClusterUpdateFailedTrack returns a track for when a user fails to update a cluster
  954. func ClusterUpdateFailedTrack(opts *ClusterUpdateFailedTrackOpts) segmentTrack {
  955. additionalProps := make(map[string]interface{})
  956. additionalProps["cluster_name"] = opts.ClusterName
  957. additionalProps["email"] = opts.Email
  958. additionalProps["name"] = opts.FirstName + " " + opts.LastName
  959. additionalProps["company"] = opts.CompanyName
  960. additionalProps["error_message"] = opts.ErrorMessage
  961. additionalProps["cloud_provider"] = opts.CloudProvider
  962. return getSegmentProjectTrack(
  963. opts.ProjectScopedTrackOpts,
  964. getDefaultSegmentTrack(additionalProps, ClusterUpdateFailed),
  965. )
  966. }