1
1
/*******************************************************************************
2
*Copyright (c) 2009 Eucalyptus Systems, Inc.
4
* This program is free software: you can redistribute it and/or modify
5
* it under the terms of the GNU General Public License as published by
6
* the Free Software Foundation, only version 3 of the License.
9
* This file is distributed in the hope that it will be useful, but WITHOUT
10
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14
* You should have received a copy of the GNU General Public License along
15
* with this program. If not, see <http://www.gnu.org/licenses/>.
17
* Please contact Eucalyptus Systems, Inc., 130 Castilian
18
* Dr., Goleta, CA 93101 USA or visit <http://www.eucalyptus.com/licenses/>
19
* if you need additional information or have any questions.
21
* This file may incorporate work covered under the following copyright and
24
* Software License Agreement (BSD License)
26
* Copyright (c) 2008, Regents of the University of California
27
* All rights reserved.
29
* Redistribution and use of this software in source and binary forms, with
30
* or without modification, are permitted provided that the following
33
* Redistributions of source code must retain the above copyright notice,
34
* this list of conditions and the following disclaimer.
36
* Redistributions in binary form must reproduce the above copyright
37
* notice, this list of conditions and the following disclaimer in the
38
* documentation and/or other materials provided with the distribution.
40
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
41
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
42
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
43
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
44
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
45
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
46
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
47
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
48
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
49
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
50
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. USERS OF
51
* THIS SOFTWARE ACKNOWLEDGE THE POSSIBLE PRESENCE OF OTHER OPEN SOURCE
52
* LICENSED MATERIAL, COPYRIGHTED MATERIAL OR PATENTED MATERIAL IN THIS
53
* SOFTWARE, AND IF ANY SUCH MATERIAL IS DISCOVERED THE PARTY DISCOVERING
54
* IT MAY INFORM DR. RICH WOLSKI AT THE UNIVERSITY OF CALIFORNIA, SANTA
55
* BARBARA WHO WILL THEN ASCERTAIN THE MOST APPROPRIATE REMEDY, WHICH IN
56
* THE REGENTS’ DISCRETION MAY INCLUDE, WITHOUT LIMITATION, REPLACEMENT
57
* OF THE CODE SO IDENTIFIED, LICENSING OF THE CODE SO IDENTIFIED, OR
58
* WITHDRAWAL OF THE CODE CAPABILITY TO THE EXTENT NEEDED TO COMPLY WITH
59
* ANY SUCH LICENSES OR RIGHTS.
60
*******************************************************************************/
2
*Copyright (c) 2009 Eucalyptus Systems, Inc.
4
* This program is free software: you can redistribute it and/or modify
5
* it under the terms of the GNU General Public License as published by
6
* the Free Software Foundation, only version 3 of the License.
9
* This file is distributed in the hope that it will be useful, but WITHOUT
10
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14
* You should have received a copy of the GNU General Public License along
15
* with this program. If not, see <http://www.gnu.org/licenses/>.
17
* Please contact Eucalyptus Systems, Inc., 130 Castilian
18
* Dr., Goleta, CA 93101 USA or visit <http://www.eucalyptus.com/licenses/>
19
* if you need additional information or have any questions.
21
* This file may incorporate work covered under the following copyright and
24
* Software License Agreement (BSD License)
26
* Copyright (c) 2008, Regents of the University of California
27
* All rights reserved.
29
* Redistribution and use of this software in source and binary forms, with
30
* or without modification, are permitted provided that the following
33
* Redistributions of source code must retain the above copyright notice,
34
* this list of conditions and the following disclaimer.
36
* Redistributions in binary form must reproduce the above copyright
37
* notice, this list of conditions and the following disclaimer in the
38
* documentation and/or other materials provided with the distribution.
40
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
41
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
42
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
43
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
44
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
45
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
46
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
47
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
48
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
49
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
50
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. USERS OF
51
* THIS SOFTWARE ACKNOWLEDGE THE POSSIBLE PRESENCE OF OTHER OPEN SOURCE
52
* LICENSED MATERIAL, COPYRIGHTED MATERIAL OR PATENTED MATERIAL IN THIS
53
* SOFTWARE, AND IF ANY SUCH MATERIAL IS DISCOVERED THE PARTY DISCOVERING
54
* IT MAY INFORM DR. RICH WOLSKI AT THE UNIVERSITY OF CALIFORNIA, SANTA
55
* BARBARA WHO WILL THEN ASCERTAIN THE MOST APPROPRIATE REMEDY, WHICH IN
56
* THE REGENTS’ DISCRETION MAY INCLUDE, WITHOUT LIMITATION, REPLACEMENT
57
* OF THE CODE SO IDENTIFIED, LICENSING OF THE CODE SO IDENTIFIED, OR
58
* WITHDRAWAL OF THE CODE CAPABILITY TO THE EXTENT NEEDED TO COMPLY WITH
59
* ANY SUCH LICENSES OR RIGHTS.
60
*******************************************************************************/
62
62
* Author: chris grzegorczyk <grze@eucalyptus.com>
64
64
package com.eucalyptus.ws;
67
import java.net.URISyntaxException;
68
66
import java.util.List;
67
import java.util.NoSuchElementException;
71
68
import org.apache.log4j.Logger;
72
import org.mule.api.registry.RegistrationException;
73
import org.mule.api.registry.Registry;
74
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
75
import org.springframework.context.support.StaticApplicationContext;
69
import com.eucalyptus.bootstrap.Bootstrap;
70
import com.eucalyptus.bootstrap.BootstrapException;
77
71
import com.eucalyptus.bootstrap.Bootstrapper;
78
import com.eucalyptus.bootstrap.Component;
79
72
import com.eucalyptus.bootstrap.Provides;
80
import com.eucalyptus.bootstrap.Resource;
81
import com.eucalyptus.bootstrap.ServiceBootstrapper;
82
import com.eucalyptus.config.ComponentConfiguration;
83
import com.eucalyptus.config.Configuration;
84
import com.eucalyptus.config.RemoteConfiguration;
85
import com.eucalyptus.config.StorageControllerConfiguration;
86
import com.eucalyptus.config.WalrusConfiguration;
87
import com.eucalyptus.event.EventVetoedException;
88
import com.eucalyptus.event.ListenerRegistry;
89
import com.eucalyptus.event.StartComponentEvent;
90
import com.eucalyptus.util.EucalyptusCloudException;
91
import com.eucalyptus.util.LogUtil;
92
import com.eucalyptus.util.NetworkUtil;
93
import com.eucalyptus.ws.client.LocalDispatcher;
94
import com.eucalyptus.ws.client.RemoteDispatcher;
73
import com.eucalyptus.bootstrap.RunDuring;
74
import com.eucalyptus.bootstrap.Bootstrap.Stage;
75
import com.eucalyptus.component.Component;
76
import com.eucalyptus.component.Components;
77
import com.eucalyptus.component.ServiceConfiguration;
78
import com.eucalyptus.records.EventType;
79
import com.eucalyptus.util.Exceptions;
95
80
import com.eucalyptus.ws.client.ServiceDispatcher;
81
import com.google.common.collect.Lists;
82
import com.eucalyptus.records.EventRecord;
97
@Provides(resource=Resource.RemoteServices)
84
@Provides( com.eucalyptus.bootstrap.Component.any )
85
@RunDuring( Bootstrap.Stage.RemoteServicesInit )
98
86
public class ServiceDispatchBootstrapper extends Bootstrapper {
99
87
private static Logger LOG = Logger.getLogger( ServiceDispatchBootstrapper.class );
88
private static List<com.eucalyptus.bootstrap.Component> ignored = Lists.newArrayList( com.eucalyptus.bootstrap.Component.any,
89
com.eucalyptus.bootstrap.Component.component );
102
public boolean load( Resource current ) throws Exception {
92
public boolean load( Stage current ) throws Exception {
93
/** TODO: ultimately remove this: it is legacy and enforces a one-to-one relationship between component impls **/
94
for ( com.eucalyptus.bootstrap.Component c : com.eucalyptus.bootstrap.Component.values( ) ) {
95
if ( ignored.contains( c ) ) continue;
97
Component comp = Components.lookup( c );
98
} catch ( NoSuchElementException e ) {
99
throw Exceptions.uncatchable( "Failed to lookup required component: " + c.name( ) );
102
LOG.trace( "Touching class: " + ServiceDispatcher.class );
103
boolean failed = false;
104
for ( Component comp : Components.list( ) ) {
105
EventRecord.here( ServiceVerifyBootstrapper.class, EventType.COMPONENT_INFO, comp.getName( ), comp.isEnabled( ).toString( ) ).info( );
106
for ( ServiceConfiguration s : comp.list( ) ) {
108
if ( comp.isEnabled( ) ) {
109
comp.buildService( s );
111
} catch ( Throwable ex ) {
119
BootstrapException.throwFatal( "Failures occurred while attempting to start component services. See the log files for more information." );
104
LOG.trace( "Touching class: " + ServiceDispatcher.class);
105
for( Component v : Component.values( ) ) {
106
LOG.info("Ensure component is initialized: " + LogUtil.dumpObject( v ) );
108
if( !Component.eucalyptus.isLocal( ) ) {
109
Component.eucalyptus.setHostAddress( Component.db.getHostAddress( ) );
110
registerComponent( Component.eucalyptus, new RemoteConfiguration( Component.eucalyptus, Component.eucalyptus.getUri( ) ) );
111
Component.jetty.setHostAddress( Component.db.getHostAddress( ) );
112
registerComponent( Component.jetty, new RemoteConfiguration( Component.jetty, Component.jetty.getUri( ) ) );
113
Component.cluster.setHostAddress( Component.db.getHostAddress( ) );
114
registerComponent( Component.cluster, new RemoteConfiguration( Component.cluster, Component.cluster.getUri( ) ) );
115
Component.dns.setHostAddress( Component.db.getHostAddress( ) );
116
registerComponent( Component.dns, new RemoteConfiguration( Component.dns, Component.dns.getUri( ) ) );
117
} else if( Component.eucalyptus.isLocal( ) ) {
119
registerLocalComponent( Component.db );
120
Component.db.setHostAddress( "127.0.0.1" ); //reset this afterwards due to brain damages.
121
System.setProperty( "euca.db.url", Component.db.getUri( ).toASCIIString( ) );
122
registerLocalComponent( Component.dns );
123
registerLocalComponent( Component.eucalyptus );
124
registerLocalComponent( Component.cluster );
125
registerLocalComponent( Component.jetty );
126
} catch ( Exception e ) {
132
if( !Component.walrus.isEnabled( ) || !Component.walrus.isLocal( ) ) {
133
List<WalrusConfiguration> walri = Configuration.getWalrusConfigurations( );
134
for( WalrusConfiguration w : walri ) {
136
if( NetworkUtil.testLocal( w.getHostName( ) )) {
137
Component.walrus.markLocal( );
138
registerLocalComponent( Component.walrus );
141
Component.walrus.setHostAddress( w.getHostName( ) );
142
registerComponent( Component.walrus, w );
145
} catch ( Exception e ) {
146
LOG.error( "Failed to create walrus service proxy: " + e );
151
registerLocalComponent( Component.walrus );
154
List<StorageControllerConfiguration> scs = Configuration.getStorageControllerConfigurations( );
155
boolean hasLocal = false;
156
for( StorageControllerConfiguration sc : scs ) {
158
if( NetworkUtil.testLocal( sc.getHostName( ) )) {
161
registerComponent( Component.storage, sc );
163
} catch ( Exception e ) {
164
LOG.error( "Failed to create storage controller "+sc.getName( )+" service proxy: " + e );
167
Component.storage.markLocal( );
168
System.setProperty( "euca.storage.name", sc.getName( ) );
169
LOG.info(LogUtil.subheader( "Setting euca.storage.name="+sc.getName( ) + " for: " + LogUtil.dumpObject( sc ) ));
170
registerLocalComponent( Component.storage );
177
private void registerLocalComponent( Component component ) throws EventVetoedException {
178
ListenerRegistry.getInstance( ).fireEvent( component, StartComponentEvent.getLocal( component ) );
181
private void registerLocalComponent( ComponentConfiguration componentConfiguration ) throws EventVetoedException {
182
ListenerRegistry.getInstance( ).fireEvent( componentConfiguration.getComponent( ), StartComponentEvent.getLocal( componentConfiguration ));
185
private void registerComponent( Component component, ComponentConfiguration componentConfiguration ) throws Exception {
186
ListenerRegistry.getInstance( ).fireEvent( componentConfiguration.getComponent( ), StartComponentEvent.getRemote( componentConfiguration ) );
190
126
public boolean start( ) throws Exception {
127
boolean failed = false;
128
for ( Component comp : Components.list( ) ) {
129
EventRecord.here( ServiceVerifyBootstrapper.class, EventType.COMPONENT_INFO, comp.getName( ), comp.isEnabled( ).toString( ) ).info( );
130
for ( ServiceConfiguration s : comp.list( ) ) {
132
if ( comp.isEnabled( ) ) {
133
comp.startService( s );
135
} catch ( Throwable ex ) {
143
BootstrapException.throwFatal( "Failures occurred while attempting to start component services. See the log files for more information." );