Backport: trackers: update MI to new xsd schema
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Wed, 4 Jul 2018 20:13:43 +0000 (16:13 -0400)
committerJonathan Rajotte <jonathan.rajotte-julien@efficios.com>
Fri, 21 Sep 2018 04:00:52 +0000 (00:00 -0400)
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
src/common/mi-lttng-3.0.xsd
src/common/mi-lttng.c
src/common/mi-lttng.h

index 668b0d267e4e94b217488a4e2a9bbfc7e4b6c5a4..1a957e17d5f33337f07bb2d0fafbd3f6a164eb8b 100644 (file)
@@ -280,6 +280,14 @@ THE SOFTWARE.
                </xs:sequence>
        </xs:complexType>
 
+       <xs:simpleType name="tracker_target_type">
+               <xs:restriction base="xs:string">
+                       <xs:enumeration value="ALL" />
+                       <xs:enumeration value="NONE" />
+                       <xs:enumeration value="LIST" />
+               </xs:restriction>
+       </xs:simpleType>
+
        <xs:simpleType name="pidbyint">
                <xs:restriction base="xs:integer">
                        <xs:minInclusive value="0"/>
@@ -287,43 +295,232 @@ THE SOFTWARE.
                </xs:restriction>
        </xs:simpleType>
 
-       <xs:simpleType name="pidwildcard">
-               <xs:restriction base="xs:string">
-                       <xs:enumeration value="*"/>
-               </xs:restriction>
-       </xs:simpleType>
+       <xs:complexType name="pid_target_type_choice">
+               <xs:choice>
+                       <xs:element name="id" type="tns:pidbyint" />
+                       <xs:element name="name" type="xs:string" />
+                       <xs:element name="all" type="xs:boolean" />
+               </xs:choice>
+       </xs:complexType>
 
        <xs:complexType name="pid_target_type">
                <xs:all>
-                       <xs:element name="pid">
-                               <xs:simpleType>
-                                       <xs:union memberTypes="tns:pidbyint tns:pidwildcard" />
-                               </xs:simpleType>
-                       </xs:element>
+                       <xs:element name="type" type="tns:pid_target_type_choice" />
                        <xs:element name="success" type="xs:boolean" default="false" minOccurs="0" />
                </xs:all>
        </xs:complexType>
 
        <!-- Maps to a list of pid_targets-->
-       <xs:complexType name="targets_type">
+       <xs:complexType name="pid_targets_type">
                <xs:sequence>
-                       <xs:choice>
-                               <xs:element name="pid_target" type="tns:pid_target_type" minOccurs="0" maxOccurs="unbounded"/>
-                       </xs:choice>
+                       <xs:element name="pid_target" type="tns:pid_target_type" minOccurs="0" maxOccurs="unbounded"/>
                </xs:sequence>
        </xs:complexType>
 
        <!-- Maps to a pid_tracker-->
        <xs:complexType name="pid_tracker_type">
                <xs:all>
-                       <xs:element name="targets" type="tns:targets_type" />
+                       <xs:element name="target_type" type="tns:tracker_target_type" minOccurs="0" maxOccurs="1" />
+                       <xs:element name="targets" type="tns:pid_targets_type" minOccurs="0" />
+               </xs:all>
+       </xs:complexType>
+
+       <xs:simpleType name="vpidbyint">
+               <xs:restriction base="xs:integer">
+                       <xs:minInclusive value="0"/>
+                       <xs:maxInclusive value="4294967295" />
+               </xs:restriction>
+       </xs:simpleType>
+
+       <xs:complexType name="vpid_target_type_choice">
+               <xs:choice>
+                       <xs:element name="id" type="tns:vpidbyint" />
+                       <xs:element name="name" type="xs:string" />
+                       <xs:element name="all" type="xs:boolean" />
+               </xs:choice>
+       </xs:complexType>
+
+       <xs:complexType name="vpid_target_type">
+               <xs:all>
+                       <xs:element name="type" type="tns:vpid_target_type_choice" minOccurs="0" maxOccurs="1" />
+                       <xs:element name="success" type="xs:boolean" default="false" minOccurs="0" />
+               </xs:all>
+       </xs:complexType>
+
+       <!-- Maps to a list of vpid_targets-->
+       <xs:complexType name="vpid_targets_type">
+               <xs:sequence>
+                       <xs:element name="vpid_target" type="tns:vpid_target_type" minOccurs="0" maxOccurs="unbounded"/>
+               </xs:sequence>
+       </xs:complexType>
+
+       <!-- Maps to a vpid_tracker-->
+       <xs:complexType name="vpid_tracker_type">
+               <xs:all>
+                       <xs:element name="target_type" type="tns:tracker_target_type" minOccurs="0" maxOccurs="1" />
+                       <xs:element name="targets" type="tns:vpid_targets_type" minOccurs="0" />
+               </xs:all>
+       </xs:complexType>
+
+       <xs:simpleType name="uidbyint">
+               <xs:restriction base="xs:integer">
+                       <xs:minInclusive value="0"/>
+                       <xs:maxInclusive value="4294967295" />
+               </xs:restriction>
+       </xs:simpleType>
+
+       <xs:complexType name="uid_target_type_choice">
+               <xs:choice>
+                       <xs:element name="id" type="tns:uidbyint" />
+                       <xs:element name="name" type="xs:string" />
+                       <xs:element name="all" type="xs:boolean" />
+               </xs:choice>
+       </xs:complexType>
+
+       <xs:complexType name="uid_target_type">
+               <xs:all>
+                       <xs:element name="type" type="tns:uid_target_type_choice" minOccurs="0" maxOccurs="1" />
+                       <xs:element name="success" type="xs:boolean" default="false" minOccurs="0" />
+               </xs:all>
+       </xs:complexType>
+
+       <!-- Maps to a list of uid_targets-->
+       <xs:complexType name="uid_targets_type">
+               <xs:sequence>
+                       <xs:element name="uid_target" type="tns:uid_target_type" minOccurs="0" maxOccurs="unbounded"/>
+               </xs:sequence>
+       </xs:complexType>
+
+       <!-- Maps to a uid_tracker-->
+       <xs:complexType name="uid_tracker_type">
+               <xs:all>
+                       <xs:element name="target_type" type="tns:tracker_target_type" minOccurs="0" maxOccurs="1" />
+                       <xs:element name="targets" type="tns:uid_targets_type" minOccurs="0" />
+               </xs:all>
+       </xs:complexType>
+
+       <xs:simpleType name="vuidbyint">
+               <xs:restriction base="xs:integer">
+                       <xs:minInclusive value="0"/>
+                       <xs:maxInclusive value="4294967295" />
+               </xs:restriction>
+       </xs:simpleType>
+
+       <xs:complexType name="vuid_target_type_choice">
+               <xs:choice>
+                       <xs:element name="id" type="tns:vuidbyint" />
+                       <xs:element name="name" type="xs:string" />
+                       <xs:element name="all" type="xs:boolean" />
+               </xs:choice>
+       </xs:complexType>
+
+       <xs:complexType name="vuid_target_type">
+               <xs:all>
+                       <xs:element name="type" type="tns:vuid_target_type_choice" minOccurs="0" maxOccurs="1" />
+                       <xs:element name="success" type="xs:boolean" default="false" minOccurs="0" />
+               </xs:all>
+       </xs:complexType>
+
+       <!-- Maps to a list of vuid_targets-->
+       <xs:complexType name="vuid_targets_type">
+               <xs:sequence>
+                       <xs:element name="vuid_target" type="tns:vuid_target_type" minOccurs="0" maxOccurs="unbounded"/>
+               </xs:sequence>
+       </xs:complexType>
+
+       <!-- Maps to a vuid_tracker-->
+       <xs:complexType name="vuid_tracker_type">
+               <xs:all>
+                       <xs:element name="target_type" type="tns:tracker_target_type" minOccurs="0" maxOccurs="1" />
+                       <xs:element name="targets" type="tns:vuid_targets_type" minOccurs="0" />
+               </xs:all>
+       </xs:complexType>
+
+       <xs:simpleType name="gidbyint">
+               <xs:restriction base="xs:integer">
+                       <xs:minInclusive value="0"/>
+                       <xs:maxInclusive value="4294967295" />
+               </xs:restriction>
+       </xs:simpleType>
+
+       <xs:complexType name="gid_target_type_choice">
+               <xs:choice>
+                       <xs:element name="id" type="tns:gidbyint" />
+                       <xs:element name="name" type="xs:string" />
+                       <xs:element name="all" type="xs:boolean" />
+               </xs:choice>
+       </xs:complexType>
+
+       <xs:complexType name="gid_target_type">
+               <xs:all>
+                       <xs:element name="type" type="tns:gid_target_type_choice" minOccurs="0" maxOccurs="1" />
+                       <xs:element name="success" type="xs:boolean" default="false" minOccurs="0" />
+               </xs:all>
+       </xs:complexType>
+
+       <!-- Maps to a list of gid_targets-->
+       <xs:complexType name="gid_targets_type">
+               <xs:sequence>
+                       <xs:element name="gid_target" type="tns:gid_target_type" minOccurs="0" maxOccurs="unbounded"/>
+               </xs:sequence>
+       </xs:complexType>
+
+       <!-- Maps to a gid_tracker-->
+       <xs:complexType name="gid_tracker_type">
+               <xs:all>
+                       <xs:element name="target_type" type="tns:tracker_target_type" minOccurs="0" maxOccurs="1" />
+                       <xs:element name="targets" type="tns:gid_targets_type" minOccurs="0" />
+               </xs:all>
+       </xs:complexType>
+
+       <xs:simpleType name="vgidbyint">
+               <xs:restriction base="xs:integer">
+                       <xs:minInclusive value="0"/>
+                       <xs:maxInclusive value="4294967295" />
+               </xs:restriction>
+       </xs:simpleType>
+
+       <xs:complexType name="vgid_target_type_choice">
+               <xs:choice>
+                       <xs:element name="id" type="tns:vgidbyint" />
+                       <xs:element name="name" type="xs:string" />
+                       <xs:element name="all" type="xs:boolean" />
+               </xs:choice>
+       </xs:complexType>
+
+       <xs:complexType name="vgid_target_type">
+               <xs:all>
+                       <xs:element name="type" type="tns:vgid_target_type_choice" minOccurs="0" maxOccurs="1" />
+                       <xs:element name="success" type="xs:boolean" default="false" minOccurs="0" />
+               </xs:all>
+       </xs:complexType>
+
+       <!-- Maps to a list of vgid_targets-->
+       <xs:complexType name="vgid_targets_type">
+               <xs:sequence>
+                       <xs:element name="vgid_target" type="tns:vgid_target_type" minOccurs="0" maxOccurs="unbounded"/>
+               </xs:sequence>
+       </xs:complexType>
+
+       <!-- Maps to a vgid_tracker-->
+       <xs:complexType name="vgid_tracker_type">
+               <xs:all>
+                       <xs:element name="target_type" type="tns:tracker_target_type" minOccurs="0" maxOccurs="1" />
+                       <xs:element name="targets" type="tns:vgid_targets_type" minOccurs="0" />
                </xs:all>
        </xs:complexType>
 
        <!-- Maps to a list of trackers-->
        <xs:complexType name="trackers_type">
-               <xs:sequence minOccurs="0" maxOccurs="unbounded">
-                       <xs:element name="pid_tracker" type="tns:pid_tracker_type" maxOccurs="1" />
+               <xs:sequence>
+                       <xs:choice minOccurs="0" maxOccurs="unbounded">
+                               <xs:element name="pid_tracker" type="tns:pid_tracker_type" maxOccurs="1" />
+                               <xs:element name="vpid_tracker" type="tns:vpid_tracker_type" maxOccurs="1" />
+                               <xs:element name="uid_tracker" type="tns:uid_tracker_type" maxOccurs="1" />
+                               <xs:element name="vuid_tracker" type="tns:vuid_tracker_type" maxOccurs="1" />
+                               <xs:element name="gid_tracker" type="tns:gid_tracker_type" maxOccurs="1" />
+                               <xs:element name="vgid_tracker" type="tns:vgid_tracker_type" maxOccurs="1" />
+                       </xs:choice>
                </xs:sequence>
        </xs:complexType>
 
@@ -562,7 +759,7 @@ THE SOFTWARE.
                        <xs:element name="channels" type="tns:channels_type" minOccurs="0" />
                        <xs:element name="events" type="tns:event_list_type" minOccurs="0" />
                        <xs:element name="channel" type="tns:channel_type" minOccurs="0" />
-                       <xs:element name="targets" type="tns:targets_type" minOccurs="0" />
+                       <xs:element name="trackers" type="tns:trackers_type" minOccurs="0" />
                        <xs:element name="metadata_action" type="tns:metadata_cmd_type" minOccurs="0" />
                        <xs:element name="regenerate_action" type="tns:regenerate_cmd_type" minOccurs="0" />
                </xs:choice>
index 1dcdefba92271aa56cc3486a52fbb5a36006aa22..e761bb112dd21309a63624dae3e34b3736980fb5 100644 (file)
@@ -1252,13 +1252,59 @@ int mi_lttng_trackers_open(struct mi_writer *writer)
        return mi_lttng_writer_open_element(writer, config_element_trackers);
 }
 
+static
+int get_tracker_elements(enum lttng_tracker_type tracker_type,
+               const char **element_id_tracker,
+               const char **element_target_id)
+{
+       int ret = 0;
+
+       switch (tracker_type) {
+       case LTTNG_TRACKER_PID:
+               *element_id_tracker = config_element_pid_tracker;
+               *element_target_id = config_element_target_pid;
+               break;
+       case LTTNG_TRACKER_VPID:
+               *element_id_tracker = config_element_vpid_tracker;
+               *element_target_id = config_element_target_vpid;
+               break;
+       case LTTNG_TRACKER_UID:
+               *element_id_tracker = config_element_uid_tracker;
+               *element_target_id = config_element_target_uid;
+               break;
+       case LTTNG_TRACKER_VUID:
+               *element_id_tracker = config_element_vuid_tracker;
+               *element_target_id = config_element_target_vuid;
+               break;
+       case LTTNG_TRACKER_GID:
+               *element_id_tracker = config_element_gid_tracker;
+               *element_target_id = config_element_target_gid;
+               break;
+       case LTTNG_TRACKER_VGID:
+               *element_id_tracker = config_element_vgid_tracker;
+               *element_target_id = config_element_target_vgid;
+               break;
+       default:
+               ret = LTTNG_ERR_SAVE_IO_FAIL;
+       }
+       return ret;
+}
+
 LTTNG_HIDDEN
-int mi_lttng_pid_tracker_open(struct mi_writer *writer)
+int mi_lttng_id_tracker_open(struct mi_writer *writer,
+                       enum lttng_tracker_type tracker_type)
 {
        int ret;
+       const char *element_id_tracker, *element_target_id;
+
+       ret = get_tracker_elements(tracker_type, &element_id_tracker,
+               &element_target_id);
+       if (ret) {
+               return ret;
+       }
 
-       /* Open element pid_tracker */
-       ret = mi_lttng_writer_open_element(writer, config_element_pid_tracker);
+       /* Open element $id_tracker */
+       ret = mi_lttng_writer_open_element(writer, element_id_tracker);
        if (ret) {
                goto end;
        }
@@ -1280,7 +1326,7 @@ int mi_lttng_pids_open(struct mi_writer *writer)
  * mi api bump. The use of process element break the mi api.
  */
 LTTNG_HIDDEN
-int mi_lttng_pid(struct mi_writer *writer, pid_t pid , const char *name,
+int mi_lttng_pid(struct mi_writer *writer, pid_t pid, const char *name,
                int is_open)
 {
        int ret;
@@ -1324,27 +1370,79 @@ int mi_lttng_targets_open(struct mi_writer *writer)
 }
 
 LTTNG_HIDDEN
-int mi_lttng_pid_target(struct mi_writer *writer, pid_t pid, int is_open)
+int mi_lttng_id_target(struct mi_writer *writer,
+               enum lttng_tracker_type tracker_type,
+               struct lttng_tracker_id *id, int is_open)
 {
        int ret;
+       const char *element_id_tracker, *element_target_id;
 
-       ret = mi_lttng_writer_open_element(writer,
-                       config_element_target_pid);
+       ret = get_tracker_elements(tracker_type, &element_id_tracker,
+               &element_target_id);
        if (ret) {
-               goto end;
+               return ret;
        }
 
-       /* Writing pid number
-        * Special case for element all on track untrack command
-        * All pid is represented as wildcard *
-        */
-       if ((int) pid == -1) {
-               ret = mi_lttng_writer_write_element_string(writer,
-                               config_element_pid,
-                               mi_lttng_element_track_untrack_all_wildcard);
-       } else {
+       switch (id->type) {
+       case LTTNG_ID_ALL:
+               ret = mi_lttng_writer_open_element(writer, element_target_id);
+               if (ret) {
+                       goto end;
+               }
+               ret = mi_lttng_writer_open_element(writer, config_element_type);
+               if (ret) {
+                       goto end;
+               }
+               ret = mi_lttng_writer_write_element_bool(writer, config_element_all, 1);
+               if (ret) {
+                       goto end;
+               }
+               ret = mi_lttng_writer_close_element(writer);
+               if (ret) {
+                       goto end;
+               }
+               break;
+       case LTTNG_ID_VALUE:
+               ret = mi_lttng_writer_open_element(writer, element_target_id);
+               if (ret) {
+                       goto end;
+               }
+               ret = mi_lttng_writer_open_element(writer, config_element_type);
+               if (ret) {
+                       goto end;
+               }
                ret = mi_lttng_writer_write_element_signed_int(writer,
-                               config_element_pid, (int) pid);
+                               config_element_id, id->value);
+               if (ret) {
+                       goto end;
+               }
+               ret = mi_lttng_writer_close_element(writer);
+               if (ret) {
+                       goto end;
+               }
+               break;
+       case LTTNG_ID_STRING:
+               ret = mi_lttng_writer_open_element(writer, element_target_id);
+               if (ret) {
+                       goto end;
+               }
+               ret = mi_lttng_writer_open_element(writer, config_element_type);
+               if (ret) {
+                       goto end;
+               }
+               ret = mi_lttng_writer_write_element_string(writer,
+                               config_element_name, id->string);
+               if (ret) {
+                       goto end;
+               }
+               ret = mi_lttng_writer_close_element(writer);
+               if (ret) {
+                       goto end;
+               }
+               break;
+       case LTTNG_ID_UNKNOWN:
+               ret = -LTTNG_ERR_INVALID;
+               goto end;
        }
        if (ret) {
                goto end;
index e7cf8af92ff37b840e01ebbcddbfc60c484510ac..7a86b15c9713ac772e317ea7725763750de92bdf 100644 (file)
@@ -563,7 +563,7 @@ int mi_lttng_event_fields_open(struct mi_writer *writer);
 int mi_lttng_trackers_open(struct mi_writer *writer);
 
 /*
- * Machine interface: open a pid_tracker element.
+ * Machine interface: open a id tracker element.
  *
  * writer An instance of a machine interface writer.
  *
@@ -572,7 +572,8 @@ int mi_lttng_trackers_open(struct mi_writer *writer);
  *
  * Note: A targets element is also opened for each tracker definition
  */
-int mi_lttng_pid_tracker_open(struct mi_writer *writer);
+int mi_lttng_id_tracker_open(struct mi_writer *writer,
+               enum lttng_tracker_type tracker_type);
 
 /*
  * Machine interface: open a PIDs element.
@@ -641,14 +642,16 @@ int mi_lttng_pid(struct mi_writer *writer, pid_t pid , const char *name,
 int mi_lttng_targets_open(struct mi_writer *writer);
 
 /*
- * Machine interface for track/untrack a pid_target
+ * Machine interface for track/untrack aid_target
  *
  * writer An instance of a machine interface writer.
  *
  * Returns zero if the element's value could be written.
  * Negative values indicate an error.
  */
-int mi_lttng_pid_target(struct mi_writer *writer, pid_t pid, int is_open);
+int mi_lttng_id_target(struct mi_writer *writer,
+               enum lttng_tracker_type tracker_type,
+               struct lttng_tracker_id *id, int is_open);
 
 /*
  * Machine interface of a context.
This page took 0.032299 seconds and 5 git commands to generate.