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.bootstrap;
66
import java.security.Security;
66
67
import org.apache.log4j.Logger;
67
import com.eucalyptus.util.DebugUtil;
68
import org.bouncycastle.jce.provider.BouncyCastleProvider;
69
import com.eucalyptus.component.Components;
70
import com.eucalyptus.component.Lifecycles;
71
import com.eucalyptus.context.ServiceContext;
72
import com.eucalyptus.system.LogLevels;
68
73
import com.eucalyptus.util.LogUtil;
70
75
public class SystemBootstrapper {
71
private static Logger LOG = Logger.getLogger( SystemBootstrapper.class );
72
private static SystemBootstrapper singleton;
73
private static ThreadGroup singletonGroup;
74
private static DatabaseBootstrapper singletonDb;
75
public static DatabaseBootstrapper getDatabaseBootstrapper() {
78
public static void setDatabaseBootstrapper( DatabaseBootstrapper dbBootstrapper ) {
79
singletonDb = dbBootstrapper;
76
private static Logger LOG = Logger.getLogger( SystemBootstrapper.class );
78
private static SystemBootstrapper singleton;
79
private static ThreadGroup singletonGroup;
81
81
public static SystemBootstrapper getInstance( ) {
82
82
synchronized ( SystemBootstrapper.class ) {
83
83
if ( singleton == null ) {
92
public static ThreadGroup getThreadGroup() {
93
synchronized ( SystemBootstrapper.class ) {
94
if ( singletonGroup == null ) {
95
singletonGroup = new EucalyptusThreadGroup( );
96
LOG.info( "Creating Bootstrapper instance." );
98
LOG.info( "Returning Bootstrapper instance." );
101
return singletonGroup;
103
public static Thread makeSystemThread( Runnable r ) {
104
return new Thread( getThreadGroup( ), r );
106
static class EucalyptusThreadGroup extends ThreadGroup {
107
EucalyptusThreadGroup( ) {
108
super( "Eucalyptus" );
112
public SystemBootstrapper( ) {
115
public boolean destroy( ) {
119
public boolean stop( ) throws Exception {
120
ServiceBootstrapper.getInstance( ).stop( );
93
public SystemBootstrapper( ) {}
124
95
public boolean init( ) throws Exception {
126
97
boolean doTrace = "TRACE".equals( System.getProperty( "euca.log.level" ) );
127
98
boolean doDebug = "DEBUG".equals( System.getProperty( "euca.log.level" ) ) || doTrace;
128
99
LOG.info( LogUtil.subheader( "Starting system with debugging set as: " + doDebug ) );
129
DebugUtil.DEBUG = doDebug;
130
DebugUtil.TRACE = doDebug;
131
} catch( Throwable t ) {
100
Security.addProvider( new BouncyCastleProvider( ) );
101
LogLevels.DEBUG = doDebug;
102
LogLevels.TRACE = doDebug;
103
System.setProperty( "euca.ws.port", "8773" );
104
} catch ( Throwable t ) {
132
105
t.printStackTrace( );
136
LOG.info( LogUtil.header( "Initializing resource providers." ) );
137
BootstrapFactory.initResourceProviders( );
138
LOG.info( LogUtil.header( "Initializing configuration resources." ) );
139
BootstrapFactory.initConfigurationResources( );
140
LOG.info( LogUtil.header( "Initializing bootstrappers." ) );
141
BootstrapFactory.initBootstrappers( );
109
Bootstrap.initialize( );
110
Bootstrap.Stage stage = Bootstrap.transition( );
143
} catch ( Throwable e ) {
113
} catch ( BootstrapException e ) {
114
e.printStackTrace( );
116
} catch ( Throwable t ) {
117
t.printStackTrace( );
151
* bind privileged ports
152
* generate/waitfor credentials
153
* start database server
154
* configure db/load bootstrap stack & wait for dbconfig
155
* TODO: discovery persistence contexts
156
* TODO: determine the role of this component
157
* TODO: depends callbacks
158
* TODO: remote config
159
* TODO: bootstrap bindings
161
public boolean load( ) throws Exception {
163
for ( Resource r : Resource.values( ) ) {
164
if ( r.getBootstrappers( ).isEmpty( ) ) {
165
LOG.info( "Skipping " + r + "... nothing to do." );
167
LOG.info( LogUtil.header( "Loading " + r ) );
169
for ( Bootstrapper b : r.getBootstrappers( ) ) {
170
if( !Bootstrapper.delayedDependsCheck( b ) ) {
171
LOG.info( "-X Skipping load since depends check failed: " + b.getClass( ) );
174
LOG.info( "-> load: " + b.getClass( ) );
175
boolean result = b.load( r );
176
} catch ( Throwable e ) {
177
LOG.error( b.getClass( ).getSimpleName( ) + " threw an error in load( ): " + e.getMessage( ), e );
184
} catch ( Throwable e ) {
191
public boolean start( ) throws Exception {
193
for ( Resource r : Resource.values( ) ) {
194
if ( r.getBootstrappers( ).isEmpty( ) ) {
195
LOG.info( "Skipping " + r + "... nothing to do." );
197
LOG.info( LogUtil.header( "Starting " + r ) );
199
for ( Bootstrapper b : r.getBootstrappers( ) ) {
200
if( !Bootstrapper.delayedDependsCheck( b ) ) {
201
LOG.info( "-X Skipping start since depends check failed: " + b.getClass( ) );
204
LOG.info( "-> start: " + b.getClass( ) );
205
boolean result = b.start( );
206
} catch ( Exception e ) {
207
LOG.error( b.getClass( ).getSimpleName( ) + " threw an error in start( ): " + e.getMessage( ), e );
213
} catch ( Throwable e ) {
124
public boolean load( ) throws Throwable {
126
Bootstrap.Stage stage = Bootstrap.transition( );
129
} while( ( stage = Bootstrap.transition( ) ) != null );
130
} catch ( BootstrapException e ) {
132
} catch ( Throwable t ) {
133
t.printStackTrace( );
138
Lifecycles.State.INITIALIZED.to( Lifecycles.State.LOADED ).transition( Components.list( ) );
142
public boolean start( ) throws Throwable {
144
Bootstrap.Stage stage = Bootstrap.transition( );
147
} while( ( stage = Bootstrap.transition( ) ) != null );
148
} catch ( BootstrapException e ) {
149
e.printStackTrace( );
151
} catch ( Throwable t ) {
156
Lifecycles.State.LOADED.to( Lifecycles.State.STARTED ).transition( Components.list( ) );
220
160
public String getVersion( ) {
221
161
return System.getProperty( "euca.version" );
224
164
public boolean check( ) {
168
public boolean destroy( ) {
172
public boolean stop( ) throws Exception {
173
ServiceContext.stopContext( );
228
178
private static native void shutdown( boolean reload );
230
180
public static native void hello( );
232
public static void main( String[] args ) throws Exception {
233
SystemBootstrapper b = SystemBootstrapper.getInstance( );