This version contains the following pages:

- Overview displays charts/reports (Currently only placeholders)
 - Configurations allows to define new backup configurations and link them to
 - Backups shows a list of all succesful backups and allows to restore them
 - Restores shows a history of all restored backups

It communicates with the api server via the client apis (freeezer.client.client).
The "glue code" between client apis and the UI lives in freezer.api.api.

Implements: Blueprint freezer-api-web-ui
Change-Id: I48cd8cba2b0169c6e64f650233c1a31b91ced34f
Jonas Pfannschmidt 2015-03-06 12:18:05 +00:00 committed by Memo Garcia
parent 40430ca3e9
commit 2f690e1ac5
3 changed files with 106 additions and 0 deletions

View File

@ -32,6 +32,7 @@ if os.path.exists(os.path.join(possible_topdir, 'freezer', '')):
from freezer.apiclient.backups import BackupsManager
from freezer.apiclient.registration import RegistrationManager
from freezer.apiclient.actions import ActionManager
from freezer.apiclient.configs import ConfigsManager
import exceptions
@ -57,6 +58,7 @@ class Client(object):
self.backups = BackupsManager(self)
self.registration = RegistrationManager(self)
self.actions = ActionManager(self)
self.configs = ConfigsManager(self)
def _update_api_endpoint(self):
services =

84 Normal file
View File

@ -0,0 +1,84 @@
Copyright 2014 Hewlett-Packard
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
See the License for the specific language governing permissions and
limitations under the License.
This product includes cryptographic software written by Eric Young
( This product includes software written by Tim
Hudson (
import json
import requests
from freezer.apiclient import exceptions
class ConfigsManager(object):
def __init__(self, client):
self.client = client
self.endpoint = self.client.endpoint + '/v1/configs/'
def headers(self):
return {'X-Auth-Token': self.client.auth_token}
def create(self, config_file):
r =,
if r.status_code != 201:
raise exceptions.ConfigCreationFailure(
"[*] Error {0}".format(r.status_code))
config_id = r.json()['config_id']
return config_id
def delete(self, config_id):
endpoint = self.endpoint + config_id
r = requests.delete(endpoint, headers=self.headers)
if r.status_code != 204:
raise exceptions.ConfigDeleteFailure(
"[*] Error {0}".format(r.status_code))
def list(self, limit=10, offset=0, search=None):
data = json.dumps(search) if search else None
query = {'limit': int(limit), 'offset': int(offset)}
r = requests.get(self.endpoint, headers=self.headers,
params=query, data=data)
if r.status_code != 200:
raise exceptions.ConfigGetFailure(
"[*] Error {0}".format(r.status_code))
return r.json()['configs']
def get(self, config_id):
endpoint = self.endpoint + config_id
r = requests.get(endpoint, headers=self.headers)
if r.status_code == 200:
return r.json()
if r.status_code == 404:
return None
raise exceptions.ConfigGetFailure(
"[*] Error {0}".format(r.status_code))
def update(self, config_id, update_doc):
endpoint = self.endpoint + config_id
r = requests.patch(endpoint,
if r.status_code != 200:
raise exceptions.ConfigUpdateFailure(
"[*] Error {0}: {1}".format(r.status_code, r.text))
return r.json()['version']

View File

@ -60,3 +60,23 @@ class AuthFailure(ApiClientException):
class MetadataUpdateFailure(ApiClientException):
def __init__(self, r=''):
super(self.__class__, self).__init__(r)
class ConfigCreationFailure(ApiClientException):
def __init__(self, r=''):
super(self.__class__, self).__init__(r)
class ConfigGetFailure(ApiClientException):
def __init__(self, r=''):
super(self.__class__, self).__init__(r)
class ConfigDeleteFailure(ApiClientException):
def __init__(self, r=''):
super(self.__class__, self).__init__(r)
class ConfigUpdateFailure(ApiClientException):
def __init__(self, r=''):
super(self.__class__, self).__init__(r)