|
7 | 7 | import sys |
8 | 8 | import argparse |
9 | 9 | from rmaker_cmd.node import * |
| 10 | +from rmaker_cmd.node import node_add_tags, node_remove_tags, node_set_metadata, node_delete_metadata |
10 | 11 | from rmaker_cmd.user import signup, login, forgot_password,\ |
11 | 12 | get_user_details, logout, set_region_configuration, \ |
12 | 13 | profile_list, profile_current, profile_switch, profile_add, profile_remove, delete_user |
@@ -483,6 +484,16 @@ def main(): |
483 | 484 | help='Do NOT disable challenge-response on device after successful mapping.\n' |
484 | 485 | 'Overrides the transport-specific default behavior.') |
485 | 486 |
|
| 487 | + provision_parser.add_argument('--tags', |
| 488 | + type=str, |
| 489 | + help='Comma-separated list of tags to attach during node mapping\n' |
| 490 | + '(e.g., "location:pune,name:espressif"). Tags must be in key:value format.') |
| 491 | + |
| 492 | + provision_parser.add_argument('--metadata', |
| 493 | + type=str, |
| 494 | + help='Metadata as JSON string to attach during node mapping\n' |
| 495 | + '(e.g., \'{"serial_no": "abc123", "region": "us"}\')') |
| 496 | + |
486 | 497 | add_profile_argument(provision_parser) |
487 | 498 | provision_parser.set_defaults(func=provision) |
488 | 499 |
|
@@ -839,6 +850,89 @@ def main(): |
839 | 850 | add_profile_argument(group_list_nodes_parser) |
840 | 851 | group_list_nodes_parser.set_defaults(func=group_list_nodes) |
841 | 852 |
|
| 853 | + # Node Management (tags, metadata) |
| 854 | + node_parser = subparsers.add_parser('node', |
| 855 | + help='Manage node properties (tags, metadata)') |
| 856 | + node_parser.set_defaults(func=lambda vars=None: node_parser.print_help()) |
| 857 | + node_subparsers = node_parser.add_subparsers(dest='node_command', help='Node operations') |
| 858 | + |
| 859 | + # node add-tags |
| 860 | + node_add_tags_parser = node_subparsers.add_parser('add-tags', |
| 861 | + help='Add tags to a node', |
| 862 | + description='Add tags to a node. Tags must be in key:value format.') |
| 863 | + node_add_tags_parser.add_argument('nodeid', |
| 864 | + type=str, |
| 865 | + metavar='<nodeid>', |
| 866 | + help='Node ID for the node') |
| 867 | + node_add_tags_parser.add_argument('--tags', |
| 868 | + type=str, |
| 869 | + required=True, |
| 870 | + metavar='<tags>', |
| 871 | + help='Comma-separated list of tags in key:value format\n' |
| 872 | + '(e.g., "location:pune,name:espressif")') |
| 873 | + add_profile_argument(node_add_tags_parser) |
| 874 | + node_add_tags_parser.set_defaults(func=node_add_tags) |
| 875 | + |
| 876 | + # node remove-tags |
| 877 | + node_remove_tags_parser = node_subparsers.add_parser('remove-tags', |
| 878 | + help='Remove tags from a node', |
| 879 | + description='Remove specific tags from a node.') |
| 880 | + node_remove_tags_parser.add_argument('nodeid', |
| 881 | + type=str, |
| 882 | + metavar='<nodeid>', |
| 883 | + help='Node ID for the node') |
| 884 | + node_remove_tags_parser.add_argument('--tags', |
| 885 | + type=str, |
| 886 | + required=True, |
| 887 | + metavar='<tags>', |
| 888 | + help='Comma-separated list of tags to remove\n' |
| 889 | + '(e.g., "location:pune,name:espressif")') |
| 890 | + add_profile_argument(node_remove_tags_parser) |
| 891 | + node_remove_tags_parser.set_defaults(func=node_remove_tags) |
| 892 | + |
| 893 | + # node set-metadata |
| 894 | + node_set_metadata_parser = node_subparsers.add_parser('set-metadata', |
| 895 | + help='Set or update metadata for a node', |
| 896 | + description='Set or update metadata for a node.\n' |
| 897 | + 'Follows shadow-style merge rules:\n' |
| 898 | + ' - New keys are added, existing keys are updated\n' |
| 899 | + ' - Set a key to null to delete it\n' |
| 900 | + ' - Arrays are overwritten (not merged)') |
| 901 | + node_set_metadata_parser.add_argument('nodeid', |
| 902 | + type=str, |
| 903 | + metavar='<nodeid>', |
| 904 | + help='Node ID for the node') |
| 905 | + node_set_metadata_data_group = node_set_metadata_parser.add_mutually_exclusive_group(required=True) |
| 906 | + node_set_metadata_data_group.add_argument('--data', |
| 907 | + type=str, |
| 908 | + metavar='<json>', |
| 909 | + help='Metadata as JSON string\n' |
| 910 | + '(e.g., \'{"key": "value", "region": "us"}\')') |
| 911 | + node_set_metadata_data_group.add_argument('--filepath', |
| 912 | + type=str, |
| 913 | + metavar='<path>', |
| 914 | + help='Path to JSON file containing metadata') |
| 915 | + add_profile_argument(node_set_metadata_parser) |
| 916 | + node_set_metadata_parser.set_defaults(func=node_set_metadata) |
| 917 | + |
| 918 | + # node delete-metadata |
| 919 | + node_delete_metadata_parser = node_subparsers.add_parser('delete-metadata', |
| 920 | + help='Delete metadata from a node', |
| 921 | + description='Delete metadata from a node.\n' |
| 922 | + 'Without --key, deletes all metadata.\n' |
| 923 | + 'With --key, deletes only the specified key(s).') |
| 924 | + node_delete_metadata_parser.add_argument('nodeid', |
| 925 | + type=str, |
| 926 | + metavar='<nodeid>', |
| 927 | + help='Node ID for the node') |
| 928 | + node_delete_metadata_parser.add_argument('--key', |
| 929 | + type=str, |
| 930 | + metavar='<keys>', |
| 931 | + help='Comma-separated list of metadata keys to delete\n' |
| 932 | + '(e.g., "region,name"). If omitted, all metadata is deleted.') |
| 933 | + add_profile_argument(node_delete_metadata_parser) |
| 934 | + node_delete_metadata_parser.set_defaults(func=node_delete_metadata) |
| 935 | + |
842 | 936 | # Raw API command |
843 | 937 | raw_api_parser = subparsers.add_parser('raw-api', |
844 | 938 | help='Make raw API calls to RainMaker backend', |
|
0 commit comments