diff --git a/osmclient/scripts/osm.py b/osmclient/scripts/osm.py
index 12f0576..0ce20c4 100755
--- a/osmclient/scripts/osm.py
+++ b/osmclient/scripts/osm.py
@@ -5288,6 +5288,107 @@
     #     exit(1)
 
 
+@cli_osm.command(name="alarm-show", short_help="show alarm details")
+@click.argument("uuid")
+@click.pass_context
+def alarm_show(ctx, uuid):
+    """Show alarm's detail information"""
+
+    check_client_version(ctx.obj, ctx.command.name)
+    resp = ctx.obj.ns.get_alarm(uuid=uuid)
+    alarm_filter = [
+        "uuid",
+        "name",
+        "metric",
+        "statistic",
+        "threshold",
+        "operation",
+        "ns-id",
+        "vnf-id",
+        "vdu_name",
+        "action",
+        "status",
+    ]
+    table = PrettyTable(["key", "attribute"])
+    try:
+        # Arrange and return the response data
+        resp = resp.replace("ObjectId", "")
+        alarm = eval(resp)
+        for key in alarm_filter:
+            if key == "uuid":
+                value = alarm.get(key)
+                key = "alarm-id"
+            elif key == "name":
+                value = alarm.get(key)
+                key = "alarm-name"
+            elif key == "ns-id":
+                value = alarm["tags"].get("ns_id")
+            elif key == "vdu_name":
+                value = alarm["tags"].get("vdu_name")
+            elif key == "status":
+                value = alarm["alarm_status"]
+            else:
+                value = alarm[key]
+            table.add_row([key, wrap_text(text=json.dumps(value, indent=2), width=100)])
+        table.align = "l"
+        print(table)
+    except Exception:
+        print(resp)
+
+
+# List alarm
+@cli_osm.command(name="alarm-list", short_help="list all alarms")
+@click.option(
+    "--ns_id", default=None, required=False, help="List out alarm for given ns id"
+)
+@click.pass_context
+def alarm_list(ctx, ns_id):
+    """list all alarm"""
+
+    check_client_version(ctx.obj, ctx.command.name)
+    project_name = os.getenv("OSM_PROJECT", "admin")
+    resp = ctx.obj.ns.get_alarm(project_name=project_name, ns_id=ns_id)
+
+    table = PrettyTable(
+        ["alarm-id", "metric", "threshold", "operation", "action", "status"]
+    )
+    if resp:
+        # return the response data in a table
+        resp = resp.replace("ObjectId", "")
+        resp = eval(resp)
+        for alarm in resp:
+            table.add_row(
+                [
+                    wrap_text(text=str(alarm["uuid"]), width=38),
+                    alarm["metric"],
+                    alarm["threshold"],
+                    alarm["operation"],
+                    wrap_text(text=alarm["action"], width=25),
+                    alarm["alarm_status"],
+                ]
+            )
+    table.align = "l"
+    print(table)
+
+
+# Update alarm
+@cli_osm.command(name="alarm-update", short_help="Update a alarm")
+@click.argument("uuid")
+@click.option("--threshold", default=None, help="Alarm threshold")
+@click.option("--is_enable", default=None, type=bool, help="enable or disable alarm")
+@click.pass_context
+def alarm_update(ctx, uuid, threshold, is_enable):
+    """
+    Update alarm
+
+    """
+    if not threshold and is_enable is None:
+        raise ClientException(
+            "Please provide option to update i.e threshold or is_enable"
+        )
+    ctx.obj.ns.update_alarm(uuid, threshold, is_enable)
+
+
 ##############################
 # Role Management Operations #
 ##############################
diff --git a/osmclient/sol005/ns.py b/osmclient/sol005/ns.py
index b6ccb9f..a5a5c79 100644
--- a/osmclient/sol005/ns.py
+++ b/osmclient/sol005/ns.py
@@ -532,6 +532,59 @@
             message = "failed to delete alarm: alarm {}\n{}".format(name, str(exc))
             raise ClientException(message)
 
+    def get_alarm(self, project_name=None, ns_id=None, uuid=None):
+        self._client.get_token()
+        try:
+            self._apiName = "/nsfm"
+            self._apiResource = "/alarms"
+            self._apiBase = "{}{}{}".format(
+                self._apiName, self._apiVersion, self._apiResource
+            )
+            if uuid:
+                # if request is for any uuid
+                http_code, resp = self._http.get2_cmd(
+                    "{}/{}".format(self._apiBase, uuid)
+                )
+            if not uuid:
+                http_code, resp = self._http.get2_cmd(
+                    "{}/{}/{}/{}".format(self._apiBase, uuid, project_name, ns_id)
+                )
+            if http_code == 200:
+                if resp:
+                    resp = json.loads(resp)
+                    return resp
+                else:
+                    raise ClientException("unexpected response from server")
+            else:
+                msg = resp or ""
+                raise ClientException(msg)
+        except ClientException as exc:
+            message = "failed to get alarm :\nerror:\n{}".format(str(exc))
+            raise ClientException(message)
+
+    def update_alarm(self, uuid, threshold=None, is_enable=None, wait=None):
+        self._client.get_token()
+        try:
+            op_data = {}
+            op_data["uuid"] = uuid
+            op_data["threshold"] = threshold
+            op_data["is_enable"] = is_enable
+            self._apiName = "/nsfm"
+            self._apiResource = "/alarms"
+            self._apiBase = "{}{}{}".format(
+                self._apiName, self._apiVersion, self._apiResource
+            )
+            http_code, resp = self._http.patch_cmd(
+                endpoint="{}".format(self._apiBase), postfields_dict=op_data
+            )
+            if resp:
+                resp = json.loads(resp)
+            print(resp)
+            return resp
+        except ClientException as exc:
+            message = "failed to update alarm :\nerror:\n{}".format(str(exc))
+            raise ClientException(message)
+
     def export_metric(self, metric):
         self._logger.debug("")
         self._client.get_token()
