@@ -721,6 +721,102 @@ static void extract_container_hash(struct flb_kube_meta *meta,
721
721
}
722
722
}
723
723
724
+ static void cb_results_workload (const char * name , const char * value ,
725
+ size_t vlen , void * data )
726
+ {
727
+ if (name == NULL || value == NULL || vlen == 0 || data == NULL ) {
728
+ return ;
729
+ }
730
+
731
+ struct flb_kube_meta * meta = data ;
732
+
733
+ if (meta -> workload == NULL && strcmp (name , "deployment" ) == 0 ) {
734
+ meta -> workload = flb_strndup (value , vlen );
735
+ meta -> workload_len = vlen ;
736
+ meta -> fields ++ ;
737
+ }
738
+ }
739
+
740
+ static void search_workload (struct flb_kube_meta * meta ,struct flb_kube * ctx ,msgpack_object map )
741
+ {
742
+ int i ,j ,ownerIndex ;
743
+ int regex_found ;
744
+ int replicaset_match ;
745
+ int podname_match = FLB_FALSE ;
746
+ msgpack_object k , v ;
747
+ msgpack_object_map ownerMap ;
748
+ struct flb_regex_search result ;
749
+ /* Temporary variable to store the workload value */
750
+ msgpack_object workload_val ;
751
+
752
+ for (i = 0 ; i < map .via .map .size ; i ++ ) {
753
+
754
+ k = map .via .map .ptr [i ].key ;
755
+ v = map .via .map .ptr [i ].val ;
756
+ if (strncmp (k .via .str .ptr , "name" , k .via .str .size ) == 0 ) {
757
+
758
+ if (!strncmp (v .via .str .ptr , meta -> podname , v .via .str .size )) {
759
+ podname_match = FLB_TRUE ;
760
+ }
761
+
762
+ }
763
+ /* Example JSON for the below parsing:
764
+ * "ownerReferences": [
765
+ {
766
+ "apiVersion": "apps/v1",
767
+ "kind": "ReplicaSet",
768
+ "name": "my-replicaset",
769
+ "uid": "abcd1234-5678-efgh-ijkl-9876mnopqrst",
770
+ "controller": true,
771
+ "blockOwnerDeletion": true
772
+ }
773
+ ]*/
774
+ if (podname_match && strncmp (k .via .str .ptr , "ownerReferences" , k .via .str .size ) == 0 && v .type == MSGPACK_OBJECT_ARRAY ) {
775
+ for (j = 0 ; j < v .via .array .size ; j ++ ) {
776
+ if (v .via .array .ptr [j ].type == MSGPACK_OBJECT_MAP ) {
777
+ ownerMap = v .via .array .ptr [j ].via .map ;
778
+ for (ownerIndex = 0 ; ownerIndex < ownerMap .size ; ownerIndex ++ ) {
779
+ msgpack_object key = ownerMap .ptr [ownerIndex ].key ;
780
+ msgpack_object val = ownerMap .ptr [ownerIndex ].val ;
781
+
782
+ /* Ensure both key and value are strings */
783
+ if (key .type == MSGPACK_OBJECT_STR && val .type == MSGPACK_OBJECT_STR ) {
784
+ if (strncmp (key .via .str .ptr , "kind" , key .via .str .size ) == 0 && strncmp (val .via .str .ptr , "ReplicaSet" , val .via .str .size ) == 0 ) {
785
+ replicaset_match = FLB_TRUE ;
786
+ }
787
+
788
+ if (strncmp (key .via .str .ptr , "name" , key .via .str .size ) == 0 ) {
789
+ /* Store the value of 'name' in workload_val so it can be reused by set_workload */
790
+ workload_val = val ;
791
+ if (replicaset_match ) {
792
+ regex_found = flb_regex_do (ctx -> deploymentRegex , val .via .str .ptr , val .via .str .size , & result );
793
+ if (regex_found > 0 ) {
794
+ /* Parse regex results */
795
+ flb_regex_parse (ctx -> deploymentRegex , & result , cb_results_workload , meta );
796
+ } else {
797
+ /* Set workload if regex does not match */
798
+ goto set_workload ;
799
+ }
800
+ } else {
801
+ /* Set workload if not a replicaset match */
802
+ goto set_workload ;
803
+ }
804
+ }
805
+ }
806
+ }
807
+ }
808
+ }
809
+ }
810
+ }
811
+
812
+ return ;
813
+
814
+ set_workload :
815
+ meta -> workload = flb_strndup (workload_val .via .str .ptr , workload_val .via .str .size );
816
+ meta -> workload_len = workload_val .via .str .size ;
817
+ meta -> fields ++ ;
818
+ }
819
+
724
820
static int search_podname_and_namespace (struct flb_kube_meta * meta ,
725
821
struct flb_kube * ctx ,
726
822
msgpack_object map )
@@ -1006,6 +1102,7 @@ static int merge_meta(struct flb_kube_meta *meta, struct flb_kube *ctx,
1006
1102
k = api_map .via .map .ptr [i ].key ;
1007
1103
if (k .via .str .size == 8 && !strncmp (k .via .str .ptr , "metadata" , 8 )) {
1008
1104
meta_val = api_map .via .map .ptr [i ].val ;
1105
+ search_workload (meta ,ctx ,meta_val );
1009
1106
if (meta_val .type == MSGPACK_OBJECT_MAP ) {
1010
1107
meta_found = FLB_TRUE ;
1011
1108
}
@@ -1123,6 +1220,13 @@ static int merge_meta(struct flb_kube_meta *meta, struct flb_kube *ctx,
1123
1220
}
1124
1221
}
1125
1222
1223
+ if (meta -> workload != NULL ) {
1224
+ msgpack_pack_str (& mp_pck , 8 );
1225
+ msgpack_pack_str_body (& mp_pck , "workload" , 8 );
1226
+ msgpack_pack_str (& mp_pck , meta -> workload_len );
1227
+ msgpack_pack_str_body (& mp_pck , meta -> workload , meta -> workload_len );
1228
+ }
1229
+
1126
1230
/* Append API Server content */
1127
1231
if (have_uid >= 0 ) {
1128
1232
v = meta_val .via .map .ptr [have_uid ].val ;
@@ -1693,8 +1797,7 @@ int flb_kube_meta_get(struct flb_kube *ctx,
1693
1797
return 0 ;
1694
1798
}
1695
1799
1696
- int flb_kube_meta_release (struct flb_kube_meta * meta )
1697
- {
1800
+ int flb_kube_meta_release (struct flb_kube_meta * meta ) {
1698
1801
int r = 0 ;
1699
1802
1700
1803
if (meta -> namespace ) {
@@ -1731,6 +1834,10 @@ int flb_kube_meta_release(struct flb_kube_meta *meta)
1731
1834
flb_free (meta -> cache_key );
1732
1835
}
1733
1836
1837
+ if (meta -> workload ) {
1838
+ flb_free (meta -> workload );
1839
+ }
1840
+
1734
1841
if (meta -> cluster ) {
1735
1842
flb_free (meta -> cluster );
1736
1843
}
0 commit comments