Statistics
| Branch: | Revision:

root / src / com / rackspacecloud / android / AddLoadBalancerActivity.java @ b722cab3

History | View | Annotate | Download (8.6 kB)

1
package com.rackspacecloud.android;
2

    
3
import java.util.ArrayList;
4

    
5
import org.apache.http.HttpResponse;
6

    
7
import com.rackspace.cloud.loadbalancer.api.client.Algorithm;
8
import com.rackspace.cloud.loadbalancer.api.client.LoadBalancer;
9
import com.rackspace.cloud.loadbalancer.api.client.LoadBalancerManager;
10
import com.rackspace.cloud.loadbalancer.api.client.Node;
11
import com.rackspace.cloud.loadbalancer.api.client.Protocol;
12
import com.rackspace.cloud.servers.api.client.CloudServersException;
13
import com.rackspace.cloud.servers.api.client.http.HttpBundle;
14

    
15
import android.app.Activity;
16
import android.content.Intent;
17
import android.os.AsyncTask;
18
import android.os.Bundle;
19
import android.view.View;
20
import android.view.View.OnClickListener;
21
import android.widget.AdapterView;
22
import android.widget.AdapterView.OnItemSelectedListener;
23
import android.widget.ArrayAdapter;
24
import android.widget.Button;
25
import android.widget.EditText;
26
import android.widget.Spinner;
27

    
28
public class AddLoadBalancerActivity extends CloudActivity implements OnItemSelectedListener {
29

    
30
        //TODO Shared Virtual IP (not in API though?)
31
        private static final String[] VIP_TYPES = {"Public", "ServiceNet"};
32
        private static final String[] REGIONS = {"ORD", "DFW"};
33

    
34
        private static final int ADD_NODES_ACTIVITY_CODE = 165;
35

    
36
        private Protocol[] protocols;
37
        private Algorithm[] algorithms;
38
        private Spinner protocolSpinner;
39
        private Spinner algorithmSpinner;
40
        private Spinner vipSpinner;
41
        private Spinner regionSpinner;
42
        private EditText portText;
43
        private Protocol selectedProtocol;
44
        private Algorithm selectedAlgorithm;
45
        private String selectedVipType;
46
        private String selectedRegion;
47
        private String selectedName;
48
        private String selectedPort;
49
        private ArrayList<Node> nodes;
50
        private LoadBalancer loadBalancer;
51

    
52
        @Override
53
        public void onCreate(Bundle savedInstanceState) {
54
                super.onCreate(savedInstanceState);
55
                setContentView(R.layout.view_add_loadbalancer);
56
                restoreState(savedInstanceState);
57
        }
58

    
59
        @SuppressWarnings("unchecked")
60
        protected void restoreState(Bundle state) {
61
                super.restoreState(state);
62
                
63
                portText = (EditText)findViewById(R.id.edit_port_text);
64

    
65
                if(state != null && state.containsKey("nodes")){
66
                        nodes = (ArrayList<Node>) state.getSerializable("nodes");
67
                }
68
                else{
69
                        nodes = new ArrayList<Node>();
70
                }
71

    
72
                loadProtocolSpinner();
73
                loadAlgorithmSpinner();
74
                loadVipSpinner();
75
                loadRegionSpinner();
76
                setUpButtons();
77
        }
78

    
79
        @Override
80
        protected void onSaveInstanceState(Bundle outState) {
81
                super.onSaveInstanceState(outState);
82
                outState.putSerializable("nodes", nodes);
83
        }
84

    
85
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
86
                if (parent == protocolSpinner) {
87
                        selectedProtocol = protocols[position];
88
                        //portText.setText(protocols[position].getDefaultPort());
89
                } 
90
                else if (parent == algorithmSpinner){
91
                        selectedAlgorithm = algorithms[position];
92
                }
93
                else if (parent == vipSpinner){
94
                        selectedVipType = VIP_TYPES[position];
95
                }
96
                else if (parent == regionSpinner){
97
                        selectedRegion = REGIONS[position];
98
                }
99
        }
100

    
101
        public void onNothingSelected(AdapterView<?> parent) {
102

    
103
        }
104

    
105
        private void setUpButtons(){
106
                Button addNodes = (Button) findViewById(R.id.add_nodes_button);
107
                addNodes.setOnClickListener(new OnClickListener() {
108

    
109
                        @Override
110
                        public void onClick(View v) {
111
                                Intent viewIntent = new Intent(getApplicationContext(), AddNodesActivity.class);
112
                                viewIntent.putExtra("nodes", nodes);
113
                                startActivityForResult(viewIntent, ADD_NODES_ACTIVITY_CODE);
114
                        }
115
                });
116

    
117
                Button addLoadBalancer = (Button) findViewById(R.id.add_lb_button);
118
                addLoadBalancer.setOnClickListener(new OnClickListener() {
119

    
120
                        @Override
121
                        public void onClick(View v) {
122
                                selectedName = ((EditText)findViewById(R.id.edit_lb_name_text)).getText().toString();
123
                                selectedPort = ((EditText)findViewById(R.id.edit_port_text)).getText().toString();
124
                                if(!validName()){
125
                                        showAlert("Error", "Load balancer name cannot be blank.");
126
                                }
127
                                else if(!validPort()){
128
                                        showAlert("Error", "Must have a protocol port number that is between 1 and 65535.");
129
                                }
130
                                else{
131
                                        loadBalancer = new LoadBalancer();
132
                                        loadBalancer.setName(selectedName);
133
                                        loadBalancer.setProtocol(selectedProtocol.getName());
134
                                        loadBalancer.setPort(selectedPort);
135
                                        loadBalancer.setVirtualIpType(selectedVipType);
136
                                        loadBalancer.setAlgorithm(selectedAlgorithm.getName());
137
                                        loadBalancer.setNodes(nodes);
138
                                        new AddLoadBalancerTask().execute();
139
                                }
140
                        }
141
                });
142
        }
143

    
144
        private boolean validName(){
145
                return !selectedName.equals("");
146
        }
147

    
148
        private boolean validPort(){
149
                return !selectedPort.equals("") && Integer.valueOf(selectedPort) > 0 && Integer.valueOf(selectedPort) < 65536;
150
        }
151

    
152
        private void loadRegionSpinner() {
153
                regionSpinner = (Spinner) findViewById(R.id.edit_region_spinner);
154
                regionSpinner.setOnItemSelectedListener(this);
155

    
156
                ArrayAdapter<String> regionAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, REGIONS);
157
                regionAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
158
                regionSpinner.setAdapter(regionAdapter);
159
        }
160

    
161
        private void loadVipSpinner() {
162
                vipSpinner = (Spinner) findViewById(R.id.edit_vip_spinner);
163
                vipSpinner.setOnItemSelectedListener(this);
164

    
165
                ArrayAdapter<String> vipAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, VIP_TYPES);
166
                vipAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
167
                vipSpinner.setAdapter(vipAdapter);
168
        }
169

    
170
        private void loadProtocolSpinner() {
171
                protocolSpinner = (Spinner) findViewById(R.id.edit_protocol_spinner);
172
                protocolSpinner.setOnItemSelectedListener(this);
173
                String protocolNames[] = new String[Protocol.getProtocols().size()]; 
174
                protocols = new Protocol[Protocol.getProtocols().size()];
175

    
176
                for(int i = 0; i < Protocol.getProtocols().size(); i++){
177
                        protocols[i] = Protocol.getProtocols().get(i);
178
                        protocolNames[i] = Protocol.getProtocols().get(i).getName();
179
                }
180

    
181
                ArrayAdapter<String> protocolAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, protocolNames);
182
                protocolAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
183
                protocolSpinner.setAdapter(protocolAdapter);
184
        }
185

    
186
        private void loadAlgorithmSpinner() {
187
                algorithmSpinner = (Spinner) findViewById(R.id.edit_algorithm_spinner);
188
                algorithmSpinner.setOnItemSelectedListener(this);
189
                String algorithmNames[] = new String[Algorithm.getAlgorithms().size()]; 
190
                algorithms = new Algorithm[Algorithm.getAlgorithms().size()];
191

    
192
                for(int i = 0; i < Algorithm.getAlgorithms().size(); i++){
193
                        algorithms[i] = Algorithm.getAlgorithms().get(i);
194
                        algorithmNames[i] = Algorithm.getAlgorithms().get(i).getName();
195
                }
196

    
197
                ArrayAdapter<String> algorithmAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, algorithmNames);
198
                algorithmAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
199
                algorithmSpinner.setAdapter(algorithmAdapter);
200
        }
201

    
202
        @SuppressWarnings("unchecked")
203
        @Override
204
        protected void onActivityResult (int requestCode, int resultCode, Intent data){
205
                if(requestCode == ADD_NODES_ACTIVITY_CODE && resultCode == RESULT_OK){
206
                        //set node list
207
                        nodes = ((ArrayList<Node>)data.getSerializableExtra("nodes"));
208
                }
209
                else if(requestCode == ADD_NODES_ACTIVITY_CODE && resultCode == RESULT_CANCELED){
210
                        //don't change list
211
                        
212
                }
213
        }
214

    
215
        private class AddLoadBalancerTask extends AsyncTask<Void, Void, HttpBundle> {
216
                private CloudServersException exception;
217

    
218
                protected void onPreExecute(){
219
                        showDialog();
220
                }
221
                
222
                @Override
223
                protected HttpBundle doInBackground(Void... arg0) {
224
                        HttpBundle bundle = null;
225
                        try {
226
                                bundle = (new LoadBalancerManager(getContext())).create(loadBalancer, LoadBalancer.getRegionUrl(selectedRegion));
227
                        } catch (CloudServersException e) {
228
                                exception = e;
229
                        }
230
                        return bundle;
231
                }
232

    
233
                @Override
234
                protected void onPostExecute(HttpBundle bundle) {
235
                        hideDialog();
236
                        HttpResponse response = bundle.getResponse();
237
                        if (response != null) {
238
                                int statusCode = response.getStatusLine().getStatusCode();
239
                                if (statusCode == 202) {
240
                                        setResult(Activity.RESULT_OK);
241
                                        finish();
242
                                } else {
243
                                        CloudServersException cse = parseCloudServersException(response);
244
                                        if ("".equals(cse.getMessage())) {
245
                                                showError("There was a problem creating your load balancer.", bundle);
246
                                        } else {
247
                                                //if container with same name already exists
248
                                                showError("There was a problem creating your load balancer: " + cse.getMessage() + "\n See details for more information", bundle);
249
                                        }
250
                                }
251
                        } else if (exception != null) {
252
                                showError("There was a problem creating your container: " + exception.getMessage()+"\n See details for more information.", bundle);                                
253
                        }
254
                        finish();
255
                }
256
        }
257
}