~vcs-imports/elasticfox/trunk

« back to all changes in this revision

Viewing changes to src/chrome/content/ec2ui/controller.js

  • Committer: jhatax
  • Date: 2009-03-21 04:24:40 UTC
  • Revision ID: vcs-imports@canonical.com-20090321042440-9efsr19bbxomq3dp
This update to Elasticfox contains the following changes:

1. Tagging for AMIs and Elastic IPs
2. Fix for Register Image from the Images tab
3. Snapshot inherits tag of Volume it was created from
4. An instance in the EU can be bundled into a bucket and registered in the US and vice-versa
5. Better checks when specifying a bucket for bundling or manifest path for registering
6. An EBS volume cannot be attached to a Windows instance that is not "Ready to Use"
7. Elasticfox now supports Firefox Versions 2.0 through 3.5.*
8. The AMI Migration dialog is non-modal so that the user can continue using Elasticfox
while the migration occurs in the background

Please report any issues via sourceforge or the AWS page for Elasticfox.


M    src/install.rdf
M    src/ec2ui.rdf
M    src/install.js
M    src/chrome/content/ec2ui/eipdetaildialog.js
M    src/chrome/content/ec2ui/newattachmentdialog.js
M    src/chrome/content/ec2ui/controller.js
M    src/chrome/content/ec2ui/volumesview.js
M    src/chrome/content/ec2ui/utils.js
M    src/chrome/content/ec2ui/eipview.js
M    src/chrome/content/ec2ui/bundletasksview.js
M    src/chrome/content/ec2ui/client.js
M    src/chrome/content/ec2ui/instancesview.js
M    src/chrome/content/ec2ui/baseimagesview.js
M    src/chrome/content/ec2ui/dialog_new_volume.xul
M    src/chrome/content/ec2ui/eip_tab_overlay.xul
M    src/chrome/content/ec2ui/preferences.js
M    src/chrome/content/ec2ui/newimagedialog.js
M    src/chrome/content/ec2ui/dialog_ami_details.xul
M    src/chrome/content/ec2ui/dialog_eip_details.xul
M    src/chrome/content/ec2ui/newvolumedialog.js
M    src/chrome/content/ec2ui/amidetaildialog.js
M    src/chrome/content/ec2ui/volumedetaildialog.js
M    src/chrome/content/ec2ui/bundleInstanceDialog.js
M    src/chrome/content/ec2ui/session.js
M    src/chrome/content/ec2ui/amisview.js
M    src/chrome/content/ec2ui/model.js

Show diffs side-by-side

added added

removed removed

Lines of Context:
13
13
 
14
14
        if (activeReg == region) {
15
15
            // The image's region is the same as the active region
16
 
            registerImage(manifestPath, callback, region);
 
16
            this.registerImage(manifestPath, callback);
17
17
        } else {
18
 
            ec2_httpclient.queryEC2InRegion(region, "RegisterImage", [["ImageLocation", manifestPath]], this, true, "onCompleteRegisterImage", callback);
 
18
            ec2_httpclient.queryEC2InRegion(region,
 
19
                                            "RegisterImage",
 
20
                                            [["ImageLocation", manifestPath]],
 
21
                                            this,
 
22
                                            true,
 
23
                                            "onCompleteRegisterImage",
 
24
                                            callback);
19
25
        }
20
26
    },
21
27
 
45
51
    },
46
52
 
47
53
    onCompleteCreateSnapshot: function (objResponse) {
 
54
        var xmlDoc = objResponse.xmlDoc;
 
55
        var id = getNodeValueByName(xmlDoc, "snapshotId");
 
56
 
48
57
        if (objResponse.callback)
49
 
            objResponse.callback();
 
58
            objResponse.callback(id);
50
59
    },
51
60
 
52
61
    attachVolume: function (volumeId, instanceId, device, callback) {
62
71
            objResponse.callback();
63
72
    },
64
73
 
65
 
    createVolume: function (size, snapshotId, zone, callback) {
 
74
    createVolume : function (size, snapshotId, zone, callback) {
66
75
        params = []
67
76
        if (size != null) params.push(["Size", size]);
68
77
        if (snapshotId != null) params.push(["SnapshotId", snapshotId]);
71
80
    },
72
81
 
73
82
    onCompleteCreateVolume: function (objResponse) {
 
83
        var xmlDoc = objResponse.xmlDoc;
 
84
        var id = getNodeValueByName(xmlDoc, "volumeId");
74
85
        if (objResponse.callback)
75
 
            objResponse.callback();
 
86
            objResponse.callback(id);
76
87
    },
77
88
 
78
89
    deleteSnapshot : function (snapshotId, callback) {
144
155
            list.push(new Volume(id, size, snapshotId, zone, status, createTime, instanceId, device, attachStatus, attachTime));
145
156
        }
146
157
 
147
 
        this.addResourceTags(list, ec2ui_session.resourceMap.volumes);
 
158
        this.addResourceTags(list, ec2ui_session.model.resourceMap.volumes, "id");
148
159
        ec2ui_model.updateVolumes(list);
149
160
        if (objResponse.callback)
150
161
            objResponse.callback(list);
169
180
            list.push(new Snapshot(id, volumeId, status, startTime, progress));
170
181
        }
171
182
 
172
 
        this.addResourceTags(list, ec2ui_session.resourceMap.snapshots);
 
183
        this.addResourceTags(list, ec2ui_session.model.resourceMap.snapshots, "id");
173
184
        ec2ui_model.updateSnapshots(list);
174
185
        if (objResponse.callback)
175
186
            objResponse.callback(list);
205
216
            objResponse.callback(ami);
206
217
    },
207
218
 
208
 
    describeImages : function (callback) {
209
 
        ec2_httpclient.queryEC2("DescribeImages", [], this, true, "onCompleteDescribeImages", callback);
 
219
    describeImages : function (isSync, callback) {
 
220
        if (!isSync) isSync = false;
 
221
        ec2_httpclient.queryEC2("DescribeImages", [], this, isSync, "onCompleteDescribeImages", callback);
210
222
    },
211
223
 
212
224
    onCompleteDescribeImages: function (objResponse) {
228
240
            list.push(new AMI(imageId, imageLocation, imageState, owner, (isPublic == 'true' ? 'public' : 'private'), platform));
229
241
        }
230
242
 
231
 
        this.addResourceTags(list, ec2ui_session.resourceMap.images);
 
243
        this.addResourceTags(list, ec2ui_session.model.resourceMap.images, "id");
232
244
        ec2ui_model.updateImages(list);
233
245
        if (objResponse.callback)
234
246
            objResponse.callback(list);
476
488
            }
477
489
        }
478
490
 
479
 
        this.addResourceTags(list, ec2ui_session.resourceMap.instances);
 
491
        this.addResourceTags(list, ec2ui_session.model.resourceMap.instances, "id");
480
492
        ec2ui_model.updateInstances(list);
481
493
        if (objResponse.callback)
482
494
            objResponse.callback(list);
483
495
    },
484
496
 
485
 
    addResourceTags : function (list, resourceType) {
 
497
    addResourceTags : function (list, resourceType, attribute) {
486
498
        if (!list || list.length == 0) {
487
499
            return;
488
500
        }
497
509
        var res = null;
498
510
        for (var i in list) {
499
511
            res = list[i];
500
 
            res.tag = tags.get(res.id) || "";
501
 
            new_tags.put(res.id, res.tag);
 
512
            res.tag = tags.get(res[attribute]) || "";
 
513
            new_tags.put(res[attribute], res.tag);
502
514
        }
503
515
        // Now that we've built the new set of instance tags, persist them
504
 
        ec2ui_session.setResourceTags(
505
 
            resourceType,
506
 
            new_tags
507
 
            );
 
516
        ec2ui_session.setResourceTags(resourceType, new_tags);
508
517
    },
509
518
 
510
519
    retrieveBundleTaskFromResponse : function (item) {
572
581
    },
573
582
 
574
583
    // Returns either the US or EU S3 endpoint
575
 
    getS3URL : function(bucketName, region) {
 
584
    getS3URL : function(bucket, region) {
576
585
        var suffix = null;
577
586
 
578
587
        // If a region wasn't passed, get the ACL for an
588
597
        } else {
589
598
            suffix = ".s3.amazonaws.com";
590
599
        }
591
 
        return "http://" + bucketName + suffix;
 
600
        return "http://" + bucket + suffix;
592
601
    },
593
602
 
594
603
    // Returns true/false based on whether the copy operation was initiated
668
677
    },
669
678
 
670
679
    // Returns the acl or ""
671
 
    getS3ACL : function(bucketName, key, region) {
672
 
        if (bucketName == null ||
673
 
            bucketName.length == 0) {
 
680
    getS3ACL : function(bucket, key, region) {
 
681
        if (bucket == null ||
 
682
            bucket.length == 0) {
674
683
            return null;
675
684
        }
676
685
 
678
687
            key = "";
679
688
        }
680
689
 
681
 
        log("Enumerating ACLs for Bucket: " + bucketName);
 
690
        log("Enumerating ACLs for Bucket: " + bucket);
682
691
        var params = "/" + key + "?acl";
683
692
        var httpRsp = ec2_httpclient.makeS3HTTPRequest(
684
693
            "GET",
685
 
            "/" + bucketName + params,
686
 
            this.getS3URL(bucketName, region) + params
 
694
            "/" + bucket + params,
 
695
            this.getS3URL(bucket, region) + params
687
696
            );
688
697
 
689
698
        if (!httpRsp.hasErrors) {
732
741
        return !httpRsp.hasErrors;
733
742
    },
734
743
 
 
744
    // Returns true or false
 
745
    writeS3KeyInBucket : function(bucket, key, content) {
 
746
        if (key == null ||
 
747
            key.length == 0 ||
 
748
            bucket == null ||
 
749
            bucket.length == 0) {
 
750
            return false;
 
751
        }
 
752
 
 
753
        var region = this.getS3BucketLocation(bucket);
 
754
        log("Bucket Region: " + region);
 
755
 
 
756
        var params = "/" + key;
 
757
        var httpRsp = ec2_httpclient.makeS3HTTPRequest(
 
758
            "PUT",
 
759
            "/" + bucket + params,
 
760
            this.getS3URL(bucket, region) + params,
 
761
            content
 
762
            );
 
763
 
 
764
        return !httpRsp.hasErrors;
 
765
    },
 
766
 
735
767
    // Returns a list of parts or null
736
 
    getS3KeyListWithPrefixInBucket : function(prefix, bucketName, region) {
 
768
    getS3KeyListWithPrefixInBucket : function(prefix, bucket, region) {
737
769
        if (prefix == null ||
738
770
            prefix.length == 0 ||
739
 
            bucketName == null ||
740
 
            bucketName.length == 0) {
 
771
            bucket == null ||
 
772
            bucket.length == 0) {
741
773
            return null;
742
774
        }
743
775
 
744
 
        log("Enumerating keys with prefix " + prefix + " in bucket " + bucketName);
 
776
        log("Enumerating keys with prefix " + prefix + " in bucket " + bucket);
745
777
        var list = null;
746
778
        var params = "/?prefix=" + prefix;
747
779
        var httpRsp = ec2_httpclient.makeS3HTTPRequest(
748
780
            "GET",
749
 
            "/" + bucketName + "/",
750
 
            this.getS3URL(bucketName, region) + params
 
781
            "/" + bucket + "/",
 
782
            this.getS3URL(bucket, region) + params
751
783
            );
752
784
 
753
785
        if (!httpRsp.hasErrors) {
765
797
    },
766
798
 
767
799
    // Returns the bucket location or null
768
 
    getS3BucketLocation : function(bucketName) {
 
800
    getS3BucketLocation : function(bucket) {
769
801
        var httpRsp = ec2_httpclient.makeS3HTTPRequest(
770
802
            "GET",
771
 
            "/" + bucketName + "/?location",
772
 
            this.getS3URL(bucketName) + "/?location"
 
803
            "/" + bucket + "/?location",
 
804
            this.getS3URL(bucket) + "/?location"
773
805
            );
774
806
 
775
807
        if (!httpRsp.hasErrors) {
787
819
    },
788
820
 
789
821
    // Returns true/false based on whether the bucket could be created
790
 
    createS3Bucket : function(bucketName, region) {
791
 
        var fileName = "/" + bucketName + "/";
792
 
        var s3url = this.getS3URL(bucketName, region);
 
822
    createS3Bucket : function(bucket, region) {
 
823
        var fileName = "/" + bucket + "/";
 
824
        var s3url = this.getS3URL(bucket, region);
793
825
        var fSuccess = false;
794
826
        var httpRsp = null;
795
827
        var content = null;
852
884
        return fSuccess;
853
885
    },
854
886
 
855
 
    bundleInstance : function (instanceId, bucketName, prefix, activeCred, callback) {
856
 
        if (!this.createS3Bucket(bucketName)) {
857
 
            return;
858
 
        }
859
 
 
 
887
    bundleInstance : function (instanceId, bucket, prefix, activeCred, callback) {
860
888
        // Generate the S3 policy string using the bucket and prefix
861
 
        var s3policy = generateS3Policy(bucketName, prefix);
 
889
        var s3policy = generateS3Policy(bucket, prefix);
862
890
        log("S3 Policy["+s3policy+"]");
863
891
 
864
892
        var s3polb64 = Base64.encode(s3policy);
870
898
 
871
899
        params = []
872
900
        params.push(["InstanceId", instanceId]);
873
 
        params.push(["Storage.S3.Bucket", bucketName]);
 
901
        params.push(["Storage.S3.Bucket", bucket]);
874
902
        params.push(["Storage.S3.Prefix", prefix]);
875
903
        params.push(["Storage.S3.AWSAccessKeyId", activeCred.accessKey]);
876
904
        params.push(["Storage.S3.UploadPolicy", s3polb64]);
1092
1120
    },
1093
1121
 
1094
1122
    getConsoleOutput : function (instanceId, callback) {
1095
 
        ec2_httpclient.queryEC2("GetConsoleOutput", [["InstanceId", instanceId]], this, true, "onCompleteGetConsoleOutput", callback);
 
1123
        return ec2_httpclient.queryEC2("GetConsoleOutput", [["InstanceId", instanceId]], this, true, "onCompleteGetConsoleOutput", callback);
1096
1124
    },
1097
1125
 
1098
1126
    onCompleteGetConsoleOutput : function (objResponse) {
1105
1133
            output = output.replace(/\x1b/mg, "\n").replace(/\r/mg, "").replace(/\n+/mg, "\n");
1106
1134
            //output = output.replace(/\n+/mg, "\n")
1107
1135
        } else {
1108
 
            output = null;
 
1136
            output = "";
1109
1137
        }
1110
1138
 
1111
1139
        if (objResponse.callback)
1112
1140
            objResponse.callback(instanceId, timestamp, output);
 
1141
        return output;
1113
1142
    },
1114
1143
 
1115
1144
    describeAvailabilityZones : function (callback) {
1149
1178
            list.push(new AddressMapping(publicIp, instanceid));
1150
1179
        }
1151
1180
 
 
1181
        this.addResourceTags(list, ec2ui_session.model.resourceMap.eips, "address");
1152
1182
        ec2ui_model.updateAddresses(list);
1153
1183
        if (objResponse.callback)
1154
1184
            objResponse.callback(list);