PowerStore : Utilisation de l’API REST PowerStore
Résumé: Cet article fournit une introduction à l’API REST PowerStore, y compris des exemples d’utilisation pratique et des erreurs courantes.
Instructions
Intégrité du nœud :
curl -H « Accept : application/json » -u « admin :******** » -X GET -k https://xx.xx.xx.xx/api/rest/hardware?select=id,name,type,lifecycle_state?type=eq.Node
Exemples de sortie :
{"id » :"00b941ceea9243f0a36e85abe9504214 »,"name » :"BaseEnclosure-NodeB »,"type » :"Node »,"lifecycle_state » :"Healthy"},
{"id » :"2877d096fd2a4cc4b3b8af97f21c1c24 »,"name » :"BaseEnclosure-NodeA »,"type » :"Node »,"lifecycle_state » :"Healthy"}
État de la réplication :
curl -H « Accept : application/json » -u « admin :******** » -X GET -k https://xx.xx.xx.xx/api/rest/replication_session?select=id,role,state,last_sync_timestamp,local_resource_id
Exemples de sortie :
{"id » :"047e38ee-9aeb-4761-8ca5-393204fe6584 »,"role » :"Metro_Preferred »,"state » :"OK »,"last_sync_timestamp » :"2026-07-16T15:48:05.628263+00:00 »,"local_resource_id » :"d34bd80e-1d43-4692-ab37-e307bc92eb73"},
{"id » :"26dd4105-a24f-4d82-b40b-20dcefbfe5df »,"role » :"Source »,"state » :"OK »,"last_sync_timestamp » :"2026-07-16T15:31:54.64127+00:00 »,"local_resource_id » :"82c40277-dee4-46de-8559-920fe5f942cc"},
{"id » :"414dba20-08b1-4d5e-a521-517a3b37473a »,"role » :"Metro_Preferred »,"state » :"OK »,"last_sync_timestamp » :"2026-07-16T15:51:05.525764+00:00 »,"local_resource_id » :"eb970724-cc3e-4661-8d71-bec7f44baf10"}
Alerte système :
curl -H « Accept : application/json » -u « admin :******** » -X GET -k https://xx.xx.xx.xx/api/rest/alert?select=id,event_code,severity,resource_type,generated_timestamp,state,description_l10n
Exemples de sortie :
{"id » :"008abb47-e72d-4608-b915-b8c01328b64e »,"event_code » :"0x01700304 »,"severity » :"Major »,"resource_type » :"remote_system »,"generated_timestamp » :"2026-05-11T01:51:01.280627+00:00 »,"state » :"ACTIVE »,"description_l10n » :"Toutes les connexions de données du système distant Ghost sont déconnectées."},
{"id » :"01114811-82a9-484e-8cf9-3da50c0e3d7b »,"event_code » :"0x01701801 »,"severity » :"Info »,"resource_type » :"volume »,"generated_timestamp » :"2026-07-14T02:15:34.764524+00:00 »,"state » :"CLEARED »,"description_l10n » :"Witness Metro configuré pour la ressource HyperV-Node1 est engagé."}
Événements d’audit :
curl -H « Accept : application/json » -u « admin :******** » -X GET -k https://xx.xx.xx.xx/api/rest/audit_event?select=id,type,timestamp,username,resource_type,resource_action,message_l10n,client_address
Le résultat peut être énorme et nécessiter un filtre. Par exemple, pour afficher les événements liés à l’administrateur de l’utilisateur. Try :
curl -H « Accept : application/json » -u « admin :******** » -X GET -k https://xx.xx.xx.xx/api/rest/audit_event?select=id,type,timestamp,username,resource_type,resource_action,message_l10n,client_address?username=eq.admin
Exemples de sortie :
{"id » :"111540 »,"type » :"Config »,"timestamp » :"2026-03-11T20:25:57.267124+00:00 »,"username » :"admin »,"resource_type » :"host »,"resource_action » :"delete »,"message_l10n » :"Suppression réussie de l’hôte avec le nom : Thors 183.24 (iSCSI) et l’ID : c698f28b-49ac-4268-a9c7-c6da66bdfbc8. »,"client_address » :"10.158.49.47"},
{"id » :"111541 »,"type » :"Config »,"timestamp » :"2026-03-11T20:25:57.337655+00:00 »,"username » :"admin »,"resource_type » :"host »,"resource_action » :"delete », » message_l10n » :"Suppression réussie des métadonnées avec les clés : [] associées à la ressource avec le type : host et l’ID : c698f28b-49ac-4268-a9c7-c6da66bdfbc8. »,"client_address » :"10.158.49.47"}
Liste de snapshots :
curl -H « Accept : application/json » -u « admin :******** » -X GET -k https://xx.xx.xx.xx/api/rest/volume_snap_list_cma_view?select=id,name,source_timestamp,description,creation_timestamp
Exemples de sortie :
{"id » :"24d7856d-d389-4f05-9752-ebb1de61a6d6 »,"name » :"Walid Snaps.PowerTriage-RHEL (Walid DO NOT DELETE). ». 2026-07-15T00:00:00Z 189403910 »,"source_timestamp » :"2026-07-15T00:03:16.096762+00:00 »,"description » :" »,"creation_timestamp » :"2026-07-15T00:03:16.096762+00:00"},
{"id » :"2cfd727f-b09c-4895-8fd5-93850fd63698 »,"name » :"Daily-File.7DSL0M2-1-001.2026-07-14T00:08:08Z 281536767 »,"source_timestamp » :"2026-07-14T00:08:08.618343+00:00 », » description » :null,"creation_timestamp » :"2026-07-14T00:08:08.618343+00:00"}
Metrics de performances :
curl -H « Accept : application/json » -H « Content-Type : application/json » -u « admin :******** » -X POST -k https://xx.xx.xx.xx/api/rest/metrics/generate -d '{ « entity » : « performance_metrics_by_appliance », « entity_id » : « A1 »,"interval » : « One_Day » }'|jq '.'
Exemples de sortie :
{ « appliance_id » : « A1 »,
« timestamp » : « 2026-07-15T00:00:00Z »,
« avg_read_latency » : 172.76094,
« avg_write_latency » : 404.14536,
« avg_mirror_write_latency » : 924.59375,
« avg_mirror_overhead_latency » : 364.82297,
« avg_latency » : 273.2135,
« avg_read_size » : 91601.2,
« avg_write_size » : 6204.5635,
« avg_io_size » : 54527.355,
« avg_read_iops » : 9.996701,
« avg_write_iops » : 7.669595,
« avg_mirror_write_iops » : 0.024386574,
« avg_total_iops » : 17.666296,
« avg_read_bandwidth » : 915709.9,
« avg_write_bandwidth » : 47586.49,
« avg_mirror_write_bandwidth » : 190.67259,
« avg_total_bandwidth » : 963296.4,
« avg_io_workload_cpu_utilization » : 0.00399437453597784,
« max_avg_read_latency » : 401.14688,
« max_avg_write_latency » : 1679.9584,
« max_avg_latency » : 652.1067,
« max_avg_mirror_write_latency » : 3842,
« max_avg_mirror_overhead_latency » : 3319,
« max_avg_read_size » : 99656.45,
« max_avg_write_size » : 30189.037,
« max_avg_io_size » : 85726.97,
« max_read_iops » : 161.2,
« max_write_iops » : 680.6,
« max_mirror_write_iops » : 3.8,
« max_total_iops » : 834,
« max_read_bandwidth » : 8509440,
« max_write_bandwidth » : 8792986,
« max_mirror_write_bandwidth » : 22732.8,
« max_total_bandwidth » : 17252044,
« max_io_workload_cpu_utilization » : 0.2170485556125641,
« repeat_count » : 1,
...
« response_definition » : « performance_metrics_by_appliance_rollup »,
« entity » : « performance_metrics_by_appliance"
}
Erreurs courantes avec l’API Rest :
Ajoutez « -v » à votre commande curl pour afficher l’erreur.
Exemple 1 : informations d’identification incorrectes.
curl -H « Accept : application/json » -u « admin :wrong_password » -k https://10.241.219.160/api/rest/hardware?select=id,name,type,lifecycle_state?type=eq.Node
* Request completely sent off
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4) :
< HTTP/1.1 401 Unauthorized
< WWW-Authenticate : SSOCustom realm="Cyclone Realm »
< content-type : application/json
< content-length : 0
Exemple 2 : httpd n’est pas en cours d’exécution.
curl -v -H « Accept : application/json » -u « admin :******** » -k https://xx.xx.xx.xx/api/rest/hardware?select=id,name,type,lifecycle_state?type=eq.Node
* Trying xx.xx.xx.xx :443...
* Échec de la connexion au port 443 xx.xx.xx.xx à partir du port 59124 de xx.xx.xx.xx : expiration du délai de
connexion* Échec de la connexion au port 443 xx.xx.xx après 31 939 ms : Impossible de se connecter au serveur
* Fermeture de la connexion #0
curl : (28) Échec de la connexion au port 443 xx.xx.xx après 31 939 ms : Impossible de se connecter au serveur
Exemple 3 : syntaxe incorrecte sans type de contenu.
curl -v -H « Accept : application/json » -u « admin :******** » -X POST -k https://xx.xx.xx.xx/api/rest/metrics/generate -d '{ « entity » : « performance_metrics_by_appliance », « entity_id » : « A1 »,"interval » : « One_Day » }'
{"messages » :[{"severity » :"Erreur »,"code » :"0xE04040030001 »,"message_l10n » :"Échec de la validation : L’en-tête Request-Content-Type '[application/x-www-form-urlencoded]' ne correspond à aucun type autorisé. Doit être l’une des suivantes : [application/json]., Un corps de demande est requis mais aucun n’a été trouvé.. »,"arguments » :[{"delimiter » : », « ,"messages » :[{"severity » :"Erreur »,"code » :"validation.request.contentType.notAllowed »,"message_l10n » :"L’en-tête Request-Content-Type '[application/x-www-form-urlencoded]' ne correspond à aucun type autorisé. Doit être l’un des suivants : [application/json]. »,"arguments » :["[application/x-www-form-urlencoded] »,"[application/json]"]},{"severity » :"Erreur »,"code » :"validation.request.body.missing »,"message_l10n » :"Un corps de demande est requis mais aucun n’a été trouvé."}]}]}]}]}
Liens utiles :
https://< PWST_CLUSTER_IP>/swaggerui/