commands.py revision 3c02dbac644d951bc264158d3f4efea577345b84
14f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta# Copyright 2014 The Chromium OS Authors. All rights reserved.
2e83b0cadc67882c1ba7f430d16dab80c9b3a0228Dan Handley# Use of this source code is governed by a BSD-style license that can be
34f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta# found in the LICENSE file.
44f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta
54f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta"""Module contains a simple client lib to the registration RPC."""
64f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta
74f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Guptaimport json
84f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Guptaimport logging
94f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Guptaimport urllib2
104f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta
114f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Guptaimport common
124f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Guptafrom fake_device_server.client_lib import common_client
134f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Guptafrom fake_device_server import commands as s_commands
144f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta
154f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta
164f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Guptaclass CommandsClient(common_client.CommonClient):
174f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta    """Client library for commands method."""
184f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta
194f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta    def __init__(self, *args, **kwargs):
204f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta        common_client.CommonClient.__init__(
214f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta                self, s_commands.COMMANDS_PATH, *args, **kwargs)
224f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta
234f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta
244f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta    def get_command(self, command_id):
254f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta        """Returns info about the given command using |command_id|.
264f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta
274f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta        @param command_id: valid id for a command.
284f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta        """
294f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta        request = urllib2.Request(self.get_url([command_id]),
304f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta                                  headers=self.add_auth_headers())
314f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta        url_h = urllib2.urlopen(request)
324f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta        return json.loads(url_h.read())
334f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta
344f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta
354f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta    def list_commands(self, device_id):
364f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta        """Returns the list of commands for the given |device_id|.
374f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta
384f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta        @param command_id: valid id for a command.
394f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta        """
40b739f22a99c96d5a295f083125505b5b5ec2f8b6Achin Gupta        request = urllib2.Request(self.get_url(params={'deviceId':device_id}),
41b739f22a99c96d5a295f083125505b5b5ec2f8b6Achin Gupta                                  headers=self.add_auth_headers())
424f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta        url_h = urllib2.urlopen(request)
434f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta        return json.loads(url_h.read())
444f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta
454f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta
464f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta    def update_command(self, command_id, data, replace=False):
474f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta        """Updates the command with |data|.
484f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta
494f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta        @param command_id: id of the command to update.
504f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta        @param data: data to update command with.
514f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta        @param replace: If True, replace all data with the given data using the
524f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta                PUT operation.
534f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta        """
544f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta        if not data:
554f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta            return
564f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta
574f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta        headers = self.add_auth_headers({'Content-Type': 'application/json'})
584f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta        request = urllib2.Request(self.get_url([command_id]), json.dumps(data),
594f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta                                  headers=headers)
604f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta        if replace:
614f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta            request.get_method = lambda: 'PUT'
624f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta        else:
634f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta            request.get_method = lambda: 'PATCH'
644f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta
654f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta        url_h = urllib2.urlopen(request)
664f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta        return json.loads(url_h.read())
674f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta
684f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta
694f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta    def create_command(self, device_id, data):
704f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta        """Creates a new command.
714f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta
724f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta        @device_id: ID of device to send command to.
734f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta        @param data: command.
744f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta        """
754f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta        headers = self.add_auth_headers({'Content-Type': 'application/json'})
764f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta        data['deviceId'] = device_id
774f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta        request = urllib2.Request(self.get_url(),
784f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta                                  json.dumps(data),
794f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta                                  headers=headers)
804f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta        url_h = urllib2.urlopen(request)
814f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta        return json.loads(url_h.read())
824f6ad66ae9fcc8bcb3b0fcee10b7ab1ffcaf1a5Achin Gupta