Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / ui / static / snf / js / glance_models.js @ 8f53cfa3

History | View | Annotate | Download (5.1 kB)

1
;(function(root){
2
    
3
    // root
4
    var root = root;
5
    
6
    // setup namepsaces
7
    var snf = root.synnefo = root.synnefo || {};
8
    var glance = snf.glance = snf.glance || {};
9
    var models = glance.models = glance.models || {}
10
    var storage = glance.storage = glance.storage || {};
11
    var util = snf.util = snf.util || {};
12

    
13
    // shortcuts
14
    var bb = root.Backbone;
15
    var slice = Array.prototype.slice
16

    
17
    models.GlanceImage = snf.models.Image.extend({
18
        api_type: 'glance',
19

    
20
        get_size: function() {
21
            return this.get('size') / 1024 / 1024;
22
        },
23

    
24
        get_readable_size: function() {
25
            var unknown_title = snf.config.image_deleted_size_title || "(none)";
26
            if (this.is_deleted()) { return unknown_title }
27
            return this.get('size') > 0 ? util.readablizeBytes(this.get('size')) : unknown_title;
28
        },
29

    
30
        get_meta: function(key) {
31
            // check for lowercase keys too since glance image meta are set 
32
            // via http headers
33
            var val = models.GlanceImage.__super__.get_meta.call(this, key)
34
            if (val == null) {
35
                val = models.GlanceImage.__super__.get_meta.call(this, 
36
                                                                 key.toLowerCase())
37
            }
38
            return val;
39
        },
40

    
41
        display_size: function() {
42
            return this.get_readable_size();
43
        },
44

    
45
        display_users: function() {
46
            try {
47
              return this.get_meta('users').split(' ').join(", ");
48
            } catch(err) { console.log(err); return ''}
49
        }
50
        
51
    })
52

    
53
    models.GlanceImages = snf.models.Images.extend({
54
        model: models.GlanceImage,
55
        api_type: 'glance',
56

    
57
        type_selections: {'personal':'My images', 
58
                          'shared': 'Shared with me', 
59
                          'public': 'Public'},
60
        type_selections_order: ['system', 'personal', 'shared', 'public'],
61
        display_metadata: ['size', 'users', 'osfamily', 'status', 'created_at', 'updated_at', 
62
            'filename', 'format', 'root_partition'],
63
        meta_labels: {'OS':'OS', 'osfamily':'OS Family', 'GUI':'GUI'},
64
        display_extra_metadata: true,
65
        read_method: 'head',
66

    
67
        // custom glance api parser
68
        parse: function (resp, xhr) {
69
            if (_.isArray(resp)) {
70
                resp = {'images': {'values': resp }};
71
            }
72
            return models.GlanceImages.__super__.parse.call(this, resp, xhr);
73
        },
74

    
75
        _read_image_from_request: function(image, msg, xhr) {
76
            var img = {};
77
            img['metadata'] = {values:{}};
78

    
79
            var headers = snf.util.parseHeaders(xhr.getAllResponseHeaders().toLowerCase());
80

    
81
            _.each(headers, function(value, key) {
82
                if (key.indexOf("x-image-meta") == -1) {
83
                    return
84
                }
85

    
86
                if (key.indexOf("x-image-meta-property") == -1) {
87
                    img[key.replace("x-image-meta-","").replace(/-/g,"_")] = _.trim(value);
88
                } else {
89
                    img.metadata.values[key.replace('x-image-meta-property-',"").replace(/-/g,"_")] = _.trim(value);
90
                }
91
            
92
            })
93

    
94
            return img;
95
        },
96

    
97
        parse_meta: function(img) {
98
            if (img.properties) {
99
                img.metadata = {};
100
                img.metadata.values = img.properties;
101
            } else {
102
                if (!img.metadata) {
103
                    img.metadata = {values:{}};
104
                }
105
            }
106

    
107
            // fixes plankton regression (returns lowercase meta keys)
108
            if (img.metadata.values.os && !img.metadata.values.OS) {
109
                img.metadata.values.OS = img.metadata.values.os;
110
            }
111

    
112
            img = models.GlanceImages.__super__.parse_meta.call(this, img);
113
            return img;
114
        },
115

    
116
        get_system_images: function() {
117
            return _.filter(this.active(), function(i) { 
118
                return _.include(_.keys(snf.config.system_images_owners), 
119
                                 i.get_owner());
120
            })
121
        },
122

    
123
        get_personal_images: function() {
124
            return _.filter(this.active(), function(i) { 
125
                return i.get_owner_uuid() == snf.user.username;
126
            });
127
        },
128

    
129
        get_public_images: function() {
130
            return _.filter(this.active(), function(i){ return i.is_public() })
131
        },
132

    
133
        get_shared_images: function() {
134
            return _.filter(this.active(), function(i){ 
135
                return !_.include(_.keys(snf.config.system_images_owners), 
136
                                  i.get_owner()) && 
137
                               i.get_owner_uuid() != snf.user.username &&
138
                               !i.is_public();
139
            });
140
        }
141

    
142
    })
143
        
144
    // replace images storage collection
145
    snf.glance.register = function() {
146
        // storage initialization
147
        snf.storage.glance = {};
148
        snf.storage.glance.images = new models.GlanceImages();
149

    
150
        // use glance images
151
        snf.storage.images = snf.storage.glance.images;
152
    }
153

    
154
})(this);
155