@@ -423,163 +423,164 @@ func (c *Client) createWorkflow(namespace string, workflowTemplateID uint64, wor
423423
424424 var newTemplateOrder []wfv1.Template
425425 for tIdx , t := range wf .Spec .Templates {
426- if t .Metadata .Labels != nil {
427- if sidecar , ok := t .Metadata .Labels ["sidecar" ]; ok {
428- if sidecar == "sys-visualization-sidecar" {
429- //Inject services, virtual routes
430- for _ , s := range t .Sidecars {
431- if len (s .Ports ) == 0 {
432- msg := fmt .Sprintf ("sidecar %s must have at least one port." , s .Name )
433- return nil , util .NewUserError (codes .InvalidArgument , msg )
434- }
426+ //Inject services, virtual routes
427+ for _ , s := range t .Sidecars {
428+ //If TTY is true, sidecar needs to be accessible by HTTP
429+ //Otherwise, we skip the sidecar
430+ if s .TTY != true {
431+ continue
432+ }
433+ if len (s .Ports ) == 0 {
434+ msg := fmt .Sprintf ("sidecar %s must have at least one port." , s .Name )
435+ return nil , util .NewUserError (codes .InvalidArgument , msg )
436+ }
435437
436- serviceNameUid := "s" + uuid .New ().String () + "-" + namespace
437- serviceNameUidDNSCompliant , err := uid2 .GenerateUID (serviceNameUid , 63 )
438- if err != nil {
439- return nil , util .NewUserError (codes .InvalidArgument , err .Error ())
440- }
441- serviceName := serviceNameUidDNSCompliant + ".alex001.onepanel.io" //todo grab domain
442-
443- serviceTemplateName := "k8s-service-template-" + uuid .New ().String ()
444- serviceTaskName := "add-service-" + uuid .New ().String ()
445- virtualServiceTemplateName := "k8s-virtual-service-template-" + uuid .New ().String ()
446- virtualServiceTaskName := "add-virtual-service-" + uuid .New ().String ()
447- var servicePorts []corev1.ServicePort
448- var routes []* networking.HTTPRoute
449- for _ , port := range s .Ports {
450- servicePort := corev1.ServicePort {
451- Name : port .Name ,
452- Protocol : port .Protocol ,
453- Port : port .ContainerPort ,
454- TargetPort : intstr .FromInt (int (port .ContainerPort )),
455- }
456- servicePorts = append (servicePorts , servicePort )
457- route := networking.HTTPRoute {
458- Match : []* networking.HTTPMatchRequest {
459- {
460- Uri : & networking.StringMatch {
461- MatchType : & networking.StringMatch_Prefix {
462- Prefix : "/" },
463- },
464- },
465- },
466- Route : []* networking.HTTPRouteDestination {
467- {
468- Destination : & networking.Destination {
469- Host : serviceNameUidDNSCompliant ,
470- Port : & networking.PortSelector {
471- Number : uint32 (port .ContainerPort ),
472- },
473- },
474- },
475- },
476- }
477- routes = append (routes , & route )
478- }
479- service := corev1.Service {
480- TypeMeta : metav1.TypeMeta {
481- APIVersion : "v1" ,
482- Kind : "Service" ,
483- },
484- ObjectMeta : metav1.ObjectMeta {
485- Name : serviceNameUidDNSCompliant ,
486- },
487- Spec : corev1.ServiceSpec {
488- Ports : servicePorts ,
489- Selector : map [string ]string {
490- "app" : serviceNameUidDNSCompliant ,
491- },
438+ serviceNameUid := "s" + uuid .New ().String () + "-" + namespace
439+ serviceNameUidDNSCompliant , err := uid2 .GenerateUID (serviceNameUid , 63 )
440+ if err != nil {
441+ return nil , util .NewUserError (codes .InvalidArgument , err .Error ())
442+ }
443+
444+ serviceName := serviceNameUidDNSCompliant + "." + * c .systemConfig .Domain ()
445+
446+ serviceTemplateName := "k8s-service-template-" + uuid .New ().String ()
447+ serviceTaskName := "add-service-" + uuid .New ().String ()
448+ virtualServiceTemplateName := "k8s-virtual-service-template-" + uuid .New ().String ()
449+ virtualServiceTaskName := "add-virtual-service-" + uuid .New ().String ()
450+ var servicePorts []corev1.ServicePort
451+ var routes []* networking.HTTPRoute
452+ for _ , port := range s .Ports {
453+ servicePort := corev1.ServicePort {
454+ Name : port .Name ,
455+ Protocol : port .Protocol ,
456+ Port : port .ContainerPort ,
457+ TargetPort : intstr .FromInt (int (port .ContainerPort )),
458+ }
459+ servicePorts = append (servicePorts , servicePort )
460+ route := networking.HTTPRoute {
461+ Match : []* networking.HTTPMatchRequest {
462+ {
463+ Uri : & networking.StringMatch {
464+ MatchType : & networking.StringMatch_Prefix {
465+ Prefix : "/" },
492466 },
493- }
494- serviceManifestBytes , err := yaml2 .Marshal (service )
495- if err != nil {
496- return nil , err
497- }
498- serviceManifest := string (serviceManifestBytes )
499- templateServiceResource := wfv1.Template {
500- Name : serviceTemplateName ,
501- Metadata : wfv1.Metadata {
502- Annotations : map [string ]string {
503- "sidecar.istio.io/inject" : "false" ,
467+ },
468+ },
469+ Route : []* networking.HTTPRouteDestination {
470+ {
471+ Destination : & networking.Destination {
472+ Host : serviceNameUidDNSCompliant ,
473+ Port : & networking.PortSelector {
474+ Number : uint32 (port .ContainerPort ),
504475 },
505476 },
506- Resource : & wfv1.ResourceTemplate {
507- Action : "create" ,
508- Manifest : serviceManifest ,
509- },
510- }
511- newTemplateOrder = append (newTemplateOrder , templateServiceResource )
512- //routes
513- virtualServiceNameUUID := "{{workflow.uid}}-" + uuid .New ().String ()
514- hosts := []string {serviceName }
515- virtualService := map [string ]interface {}{
516- "apiVersion" : "networking.istio.io/v1alpha3" ,
517- "kind" : "VirtualService" ,
518- "metadata" : metav1.ObjectMeta {
519- Name : virtualServiceNameUUID ,
520- },
521- "spec" : networking.VirtualService {
522- Http : routes ,
523- Gateways : []string {"istio-system/ingressgateway" },
524- Hosts : hosts ,
525- },
526- }
477+ },
478+ },
479+ }
480+ routes = append (routes , & route )
481+ }
482+ service := corev1.Service {
483+ TypeMeta : metav1.TypeMeta {
484+ APIVersion : "v1" ,
485+ Kind : "Service" ,
486+ },
487+ ObjectMeta : metav1.ObjectMeta {
488+ Name : serviceNameUidDNSCompliant ,
489+ },
490+ Spec : corev1.ServiceSpec {
491+ Ports : servicePorts ,
492+ Selector : map [string ]string {
493+ "app" : serviceNameUidDNSCompliant ,
494+ },
495+ },
496+ }
497+ //Istio needs to know which pod to setup the route to
498+ if wf .Spec .Templates [tIdx ].Metadata .Labels == nil {
499+ wf .Spec .Templates [tIdx ].Metadata .Labels = make (map [string ]string )
500+ }
501+ wf .Spec .Templates [tIdx ].Metadata .Labels ["app" ] = serviceNameUidDNSCompliant
502+ serviceManifestBytes , err := yaml2 .Marshal (service )
503+ if err != nil {
504+ return nil , err
505+ }
506+ serviceManifest := string (serviceManifestBytes )
507+ templateServiceResource := wfv1.Template {
508+ Name : serviceTemplateName ,
509+ Metadata : wfv1.Metadata {
510+ Annotations : map [string ]string {
511+ "sidecar.istio.io/inject" : "false" ,
512+ },
513+ },
514+ Resource : & wfv1.ResourceTemplate {
515+ Action : "create" ,
516+ Manifest : serviceManifest ,
517+ },
518+ }
519+ newTemplateOrder = append (newTemplateOrder , templateServiceResource )
520+ //routes
521+ virtualServiceNameUUID := "{{workflow.uid}}-" + uuid .New ().String ()
522+ hosts := []string {serviceName }
523+ virtualService := map [string ]interface {}{
524+ "apiVersion" : "networking.istio.io/v1alpha3" ,
525+ "kind" : "VirtualService" ,
526+ "metadata" : metav1.ObjectMeta {
527+ Name : virtualServiceNameUUID ,
528+ },
529+ "spec" : networking.VirtualService {
530+ Http : routes ,
531+ Gateways : []string {"istio-system/ingressgateway" },
532+ Hosts : hosts ,
533+ },
534+ }
527535
528- virtualServiceManifestBytes , err := yaml2 .Marshal (virtualService )
529- if err != nil {
530- return nil , err
531- }
532- virtualServiceManifest := string (virtualServiceManifestBytes )
536+ virtualServiceManifestBytes , err := yaml2 .Marshal (virtualService )
537+ if err != nil {
538+ return nil , err
539+ }
540+ virtualServiceManifest := string (virtualServiceManifestBytes )
533541
534- templateRouteResource := wfv1.Template {
535- Name : virtualServiceTemplateName ,
536- Metadata : wfv1.Metadata {
537- Annotations : map [string ]string {
538- "sidecar.istio.io/inject" : "false" ,
539- },
540- },
541- Resource : & wfv1.ResourceTemplate {
542- Action : "create" ,
543- Manifest : virtualServiceManifest ,
544- },
545- }
546- newTemplateOrder = append (newTemplateOrder , templateRouteResource )
547-
548- for i2 , t2 := range wf .Spec .Templates {
549- if t2 .Name == wf .Spec .Entrypoint {
550- if t2 .DAG != nil {
551- tasks := wf .Spec .Templates [i2 ].DAG .Tasks
552- for it , t := range tasks {
553- for _ , d := range t .Dependencies {
554- if d == "sys-send-status" {
555- wf .Spec .Templates [i2 ].DAG .Tasks [it ].Dependencies =
556- []string {d , serviceTaskName , virtualServiceTaskName }
557- }
558- }
559- }
560- wf .Spec .Templates [i2 ].DAG .Tasks = append (tasks , []wfv1.DAGTask {
561- {
562- Name : serviceTaskName ,
563- Template : serviceTemplateName ,
564- },
565- {
566- Name : virtualServiceTaskName ,
567- Template : virtualServiceTemplateName ,
568- },
569- }... )
542+ templateRouteResource := wfv1.Template {
543+ Name : virtualServiceTemplateName ,
544+ Metadata : wfv1.Metadata {
545+ Annotations : map [string ]string {
546+ "sidecar.istio.io/inject" : "false" ,
547+ },
548+ },
549+ Resource : & wfv1.ResourceTemplate {
550+ Action : "create" ,
551+ Manifest : virtualServiceManifest ,
552+ },
553+ }
554+ newTemplateOrder = append (newTemplateOrder , templateRouteResource )
555+
556+ for i2 , t2 := range wf .Spec .Templates {
557+ if t2 .Name == wf .Spec .Entrypoint {
558+ if t2 .DAG != nil {
559+ tasks := wf .Spec .Templates [i2 ].DAG .Tasks
560+ for it , t := range tasks {
561+ for _ , d := range t .Dependencies {
562+ if d == "sys-send-status" {
563+ wf .Spec .Templates [i2 ].DAG .Tasks [it ].Dependencies =
564+ []string {d , serviceTaskName , virtualServiceTaskName }
570565 }
571566 }
572567 }
568+ wf .Spec .Templates [i2 ].DAG .Tasks = append (tasks , []wfv1.DAGTask {
569+ {
570+ Name : serviceTaskName ,
571+ Template : serviceTemplateName ,
572+ },
573+ {
574+ Name : virtualServiceTaskName ,
575+ Template : virtualServiceTemplateName ,
576+ },
577+ }... )
573578 }
574- newTemplateOrder = append (newTemplateOrder , wf .Spec .Templates [tIdx ])
575- //Inject clean-up
576579 }
577- } else {
578- newTemplateOrder = append (newTemplateOrder , wf .Spec .Templates [tIdx ])
579580 }
580- } else {
581- newTemplateOrder = append (newTemplateOrder , wf .Spec .Templates [tIdx ])
582581 }
582+ newTemplateOrder = append (newTemplateOrder , wf .Spec .Templates [tIdx ])
583+ //Inject clean-up
583584 }
584585 wf .Spec .Templates = newTemplateOrder
585586 createdArgoWorkflow , err := c .ArgoprojV1alpha1 ().Workflows (namespace ).Create (wf )
0 commit comments