Subversion Repositories DevTools

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
814 mhunt 1
package com.erggroup.buildtool.daemon;
2
 
3
import com.erggroup.buildtool.daemon.BuildThread;
4
import com.erggroup.buildtool.ripple.MutableInt;
5
import com.erggroup.buildtool.ripple.MutableString;
6
import com.erggroup.buildtool.ripple.Package;
7
import com.erggroup.buildtool.ripple.ReleaseManager;
8
import com.erggroup.buildtool.ripple.RippleEngine;
9
 
10
import java.io.BufferedReader;
834 mhunt 11
import java.io.DataInputStream;
814 mhunt 12
import java.io.File;
834 mhunt 13
import java.io.FileInputStream;
14
import java.io.InputStreamReader;
814 mhunt 15
import java.sql.SQLException;
16
 
17
import org.apache.log4j.Logger;
18
 
19
/**Master Thread sub component
20
 */
21
public class MasterThread
22
  extends BuildThread
23
{
24
 
25
  /**Logger
26
   * @attribute
27
   */
28
  private static final Logger mLogger = Logger.getLogger(MasterThread.class);
29
 
864 mhunt 30
   /**constructor
814 mhunt 31
   */
32
  public MasterThread(int rtag_id, int rcon_id, String gbebuildfilter)
33
  {
818 mhunt 34
    mLogger.warn("MasterThread rtag_id " + rtag_id + " rcon_id " + rcon_id);
814 mhunt 35
    mRtagId = rtag_id;
36
    mRconId = rcon_id;
37
    mGbebuildfilter = gbebuildfilter;
38
  }
39
 
40
  /**implements the sequence diagrams coordinate slave threads, generate build files, allowed to proceed, check environment
41
   */
42
  public void run()
43
  {
44
    Integer id = new Integer(mRtagId);
45
    setName(id.toString());
46
    mLogger.debug("run");
47
    boolean exit = false;
48
    RippleEngine rippleEngine = new RippleEngine(mReleaseManager, mRtagId, true);
49
    MutableInt rconId = new MutableInt();
50
    MutableInt current_run_level = new MutableInt();
51
    MutableString addendum = new MutableString();
52
 
53
    while(!exit)
54
    {
55
      try
56
      {
57
        if ( Thread.currentThread().isInterrupted() )
58
        {
59
          mLogger.warn("run is interrupted");
60
          // unit test technique
61
          throw new ExitException();
62
        }
63
 
64
        if ( mGbebuildfilter.compareTo("unit test spawn thread") == 0)
65
        {
66
          throw new Exception();
67
        }
68
 
69
        // allowed to proceed
70
        MutableString buildFileContent = new MutableString();
71
 
72
        if ( mGbebuildfilter.compareTo("unit test check environment") != 0)
73
        {
74
          if ( mGbebuildfilter.compareTo("unit test generate build files") != 0)
75
          {
76
            if ( mGbebuildfilter.compareTo("unit test coordinate slave threads") != 0 )
77
            {
78
              mLogger.warn("run checking allowedToProceed");
79
              allowedToProceed();
80
              mLogger.info("run allowedToProceed returned");
81
 
82
              if ( mGbebuildfilter.compareTo("unit test allowed to proceed") == 0 )            
83
              {
84
                throw new ExitException();
85
              }
86
            }
87
 
88
            // coordinate slave threads
89
            mLogger.warn("run coordinate slave threads");
90
            boolean allSlaveThreadsWaiting = false;
816 mhunt 91
            boolean logWarning = true;
820 mhunt 92
            boolean logWarning2 = true;
814 mhunt 93
 
94
            while ( !allSlaveThreadsWaiting )
95
            {
96
              mReleaseManager.queryRunLevel(mRtagId);
97
 
98
              // anything but WAITING
99
              current_run_level.value = ReleaseManager.DB_IDLE;
100
              boolean moreRunLevelsConfigured = mReleaseManager.getFirstRunLevel(rconId, current_run_level);
101
 
102
              // attempt to exit loop
103
              allSlaveThreadsWaiting = true;
104
 
105
              do
106
              {
107
                if (moreRunLevelsConfigured)
108
                {
109
                  if (current_run_level.value != ReleaseManager.DB_WAITING)
110
                  {
816 mhunt 111
                    if ( logWarning )
112
                    {
113
                      mLogger.warn("run waiting for rcon id " + rconId.value);
114
                      logWarning = false;
115
                    }
116
                    else
117
                    {
118
                      mLogger.info("run waiting for rcon id " + rconId.value);                      
119
                    }
814 mhunt 120
                    allSlaveThreadsWaiting = false;
121
                  }
122
                  else
123
                  {
124
                    moreRunLevelsConfigured = mReleaseManager.getNextRunLevel(rconId, current_run_level);
125
                  }
126
                }
127
              }
128
              while (moreRunLevelsConfigured && allSlaveThreadsWaiting);
129
 
130
              if ( !allSlaveThreadsWaiting )
131
              {
132
                // to do, sleep for periodicMs
133
                if ( mGbebuildfilter.compareTo("unit test coordinate slave threads") == 0 )
134
                {
135
                  Thread.currentThread().interrupt();
136
                }
137
                else
138
                {
820 mhunt 139
                  if ( logWarning2 )
140
                  {
141
                    mLogger.warn("run sleeping 3 secs waiting for slave threads");
142
                    logWarning2 = false;
143
                  }
144
                  else
145
                  {
146
                    mLogger.info("run sleeping 3 secs waiting for slave threads");
147
                  }
814 mhunt 148
                  Thread.sleep(3000);
149
                  mLogger.info("run sleep returned");
150
                }
151
              }
152
            }
153
 
154
            if ( mGbebuildfilter.compareTo("unit test coordinate slave threads") == 0 )
155
            {
156
              throw new ExitException();
157
            }
158
 
159
            deliverChange(null, "AbtPublish", false);
866 mhunt 160
            // preserve 
161
            String reportingFullyPublished = mReportingFullyPublished;
162
            String reportingNewLabel = mReportingNewLabel;
163
            deliverChange(null, "AbtTearDown", false);
814 mhunt 164
 
866 mhunt 165
            // DEVI 47395 delete the build file now
166
            // this will prevent any chance of multiply publishing a package version
167
            File buildFile = new File(mRtagId + "build.xml");
854 mhunt 168
 
866 mhunt 169
            if ( buildFile.exists() )
854 mhunt 170
            {
866 mhunt 171
              buildFile.delete();
854 mhunt 172
            }
173
 
866 mhunt 174
            if ( mReportingPackageName != null )
814 mhunt 175
            {
866 mhunt 176
              // a dummy build file did not apply
177
              // Publishing is done outside ant by design
178
              // The preference is to do all release manager work outside ant
854 mhunt 179
 
814 mhunt 180
              boolean buildErrorOccurred = true;
181
              try
182
              {
866 mhunt 183
                if ( reportingFullyPublished != null && reportingFullyPublished.compareTo("yes") == 0 )
814 mhunt 184
                {
185
                  buildErrorOccurred = false;
186
 
866 mhunt 187
                  if ( reportingNewLabel.length() > 0 )
814 mhunt 188
                  {
189
                    Integer rtagId = new Integer(mRtagId);
852 mhunt 190
 
866 mhunt 191
                    if ( mReportingDoesNotRequireSourceControlInteraction.compareTo("false") == 0 )
852 mhunt 192
                    {
193
                      // requires source control interaction ie labelled in ClearCase
194
                      // publish to release manager
866 mhunt 195
                      mReleaseManager.autoMakeRelease(rtagId.toString(), mReportingPackageName, mReportingPackageExtension, mReportingPackageVersion, reportingNewLabel, mReportingPackageDepends, mReportingIsRipple);
852 mhunt 196
                    }
197
                    else
198
                    {
199
                      // trigger release note generation and on_make_official.wsf, which changes ownership and write access in the archive
200
                      // this should not be through autoMakeRelease (sledgehammer, the package is already official in release manager in this scenario)
201
                      // at the time of writing, calling autoMakeRelease does not help if the package was 'released' more than 24 hours ago
202
                      // this seems to be a business rule in the generate_release_notes package
203
                      // the buildtool has no option but to call autoMakeRelease at present
866 mhunt 204
                      mReleaseManager.autoMakeRelease(rtagId.toString(), mReportingPackageName, mReportingPackageExtension, mReportingPackageVersion, reportingNewLabel, mReportingPackageDepends, mReportingIsRipple);
852 mhunt 205
                    }
834 mhunt 206
 
207
                    FileInputStream abtmetrics = new FileInputStream( rtagId.toString() + "abtmetrics.txt" );
208
                    DataInputStream din = new DataInputStream( abtmetrics );
209
                    InputStreamReader isr = new InputStreamReader( din );
210
                    BufferedReader br = new BufferedReader( isr );
211
                    String metrics = br.readLine();
212
                    mLogger.warn( "execute read metrics string " + metrics );
213
                    br.close();
214
                    isr.close();
215
                    din.close();
216
 
866 mhunt 217
                    mReleaseManager.insertPackageMetrics(rtagId.toString(), mReportingPackageName, mReportingPackageExtension, metrics );
814 mhunt 218
                  }
219
                  else
220
                  {
866 mhunt 221
                    mLogger.info("run package not labelled in ClearCase on " + mReportingPackageName + mReportingPackageVersion);
814 mhunt 222
                    throw new Exception();
223
                  }
224
                }
816 mhunt 225
                else
814 mhunt 226
                {
866 mhunt 227
                  mLogger.info("run build error occurred on " + mReportingPackageName + mReportingPackageVersion);
814 mhunt 228
                  throw new Exception();
229
                }
230
 
231
              }
232
              catch( Exception e)
233
              {
234
                // an error occurred publishing to ClearCase or Release Manager
235
                // take out the archive entry first
236
                String fs = System.getProperty( "file.separator" );
866 mhunt 237
                String dpkgArchiveEntry = new String(Package.mGbeDpkg + fs + mReportingPackageName + fs + mReportingPackageVersion);
814 mhunt 238
                File dpkgArchiveEntryFile = new File(dpkgArchiveEntry);
239
                mLogger.info("run checking existence of " + dpkgArchiveEntry);
240
 
241
                if ( dpkgArchiveEntryFile.exists() )
242
                {
243
                  if ( dpkgArchiveEntryFile.isDirectory() )
244
                  {
245
                    mLogger.warn("run deleting " + dpkgArchiveEntryFile.getName());
246
                    deleteDirectory(dpkgArchiveEntryFile);
247
                  }
248
                }
249
                else
250
                {
866 mhunt 251
                  String dplyArchiveEntry = new String(Package.mGbeDply + fs + mReportingPackageName + fs + mReportingPackageVersion);
814 mhunt 252
                  File dplyArchiveEntryFile = new File(dplyArchiveEntry);
253
                  mLogger.info("run checking existence of " + dplyArchiveEntry);
254
 
255
                  if ( dplyArchiveEntryFile.exists() )
256
                  {
257
                    if ( dplyArchiveEntryFile.isDirectory() )
258
                    {
259
                      mLogger.warn("run deleting " + dplyArchiveEntryFile.getName());
260
                      deleteDirectory(dplyArchiveEntryFile);
261
                    }
262
                  }
263
                }
264
 
820 mhunt 265
                Integer rtagId = new Integer(mRtagId);
866 mhunt 266
                // pass root file
267
                mReleaseManager.excludeFromBuild(mReportingPackageVersionId, mReportingPackageVersion, rtagId.toString(), null, null, mReportingBuildFailureLogFile);
820 mhunt 268
 
269
                if ( !buildErrorOccurred )
814 mhunt 270
                {
271
                  mLogger.fatal("an error occurred publishing to ClearCase or Release Manager");
272
                  throw new Exception();
273
                }
274
              }
275
            }
276
 
277
            mLogger.info("run coordinate slave threads returned");
278
 
279
            // generate build files
280
            mLogger.warn("run generating build files");
281
            rippleEngine.planRelease();
282
 
283
            // get the build file from the ripple engine
284
            rippleEngine.getFirstBuildFileContent(buildFileContent, addendum);
285
 
286
            if ( addendum.value.compareTo("non generic") == 0 )
287
            {
288
              // publish the build file
289
              mLogger.warn("run publishing build file");
290
              mReleaseManager.publishBuildFile(mRtagId, buildFileContent.value);
291
            }
292
            else
293
            {
294
              // publish a dummy build file for either generic or dummy cases
295
              // this results in the slave not running ant
296
              mLogger.warn("run publishing dummy build file");
297
              mReleaseManager.publishBuildFile(mRtagId, mDummyBuildFileContent);
298
            }
299
          }
300
          mLogger.info("run generated build files");
301
 
302
          // change the run level for all threads in associated with the baseline
303
          mLogger.warn("run change the run level for all threads in associated with the baseline");
304
          mReleaseManager.queryReleaseConfig(mRtagId);
305
          rconId.value = -1;
306
          boolean moreBuildThreadsConfigured = mReleaseManager.getFirstReleaseConfig(rconId);
307
          mRunLevel = RunLevel.ACTIVE;
308
 
309
          do
310
          {
311
            if (moreBuildThreadsConfigured)
312
            {
816 mhunt 313
                mLogger.warn("run changing run level to ACTIVE for rcon_id " + rconId.value);
814 mhunt 314
                mRunLevel.persist(mReleaseManager, rconId.value);
315
                moreBuildThreadsConfigured = mReleaseManager.getNextReleaseConfig(rconId);
316
            }
317
          }
318
          while (moreBuildThreadsConfigured);
319
 
320
          if ( mGbebuildfilter.compareTo("unit test generate build files") == 0 )
321
          {
322
            throw new ExitException();
323
          }
324
        }
325
 
326
        mLogger.info("run changed run levels");
327
 
328
        // check environment
329
        mLogger.warn("run checkEnvironment");
330
        checkEnvironment();
331
        mLogger.info("run checkEnvironment returned");
332
 
333
        if ( mGbebuildfilter.compareTo("unit test check environment") == 0 )
334
        {
335
          throw new ExitException();
336
        }
337
 
338
        // deliver change to product baseline
339
        mLogger.warn("run deliverChange");
340
        setViewUp(buildFileContent.value, true);
341
        deliverChange(null, null, false);
342
        mLogger.info("run deliverChange returned");
343
      }
344
      catch( SQLException e )
345
      {
346
        // oracle connection issues        
347
        mLogger.warn("run oracle connection issues");
820 mhunt 348
        mSleep = true;
814 mhunt 349
      }
350
      catch( ExitException e )
351
      {
858 mhunt 352
        mLogger.warn("run ExitException");
814 mhunt 353
        exit = true;
354
      }
355
      catch( InterruptedException e )
356
      {
357
        mLogger.warn("run InterruptedException");
358
      }
359
      catch( Exception e )
360
      {
361
        mLogger.error("run indefinitePause");
362
        try
363
        {
364
          mReleaseManager.indefinitePause();
365
        }
366
        catch( Exception f )
367
        {
368
          mLogger.error("run indefinitePause failed");
369
        }
370
      }
371
 
372
      mSleep = false;
373
      if ( addendum.value.compareTo("dummy") == 0 )
374
      {
375
        // no build requirement, so let things settle
376
        mLogger.warn("run no build requirement, so let things settle");
377
        mSleep = true;
378
      }
379
    }
380
  }
381
 
382
  /**returns 'M'
383
   */
384
  protected char getMode()
385
  {
386
    mLogger.debug("getMode");
387
    return 'M';
388
  }
389
}