Search in sources :

Example 1 with ProfileVersionKey

use of io.fabric8.agent.commands.support.ProfileVersionKey in project fabric8 by jboss-fuse.

the class ProfileWatcherImpl method findProfileArifacts.

// For each profile and version return the map of bundle locations to parsers
private Map<ProfileVersionKey, Map<String, Parser>> findProfileArifacts() throws Exception {
    Map<ProfileVersionKey, Map<String, Parser>> profileArtifacts = new HashMap<ProfileVersionKey, Map<String, Parser>>();
    ProfileService profileService = fabricService.get().adapt(ProfileService.class);
    DownloadManager downloadManager = DownloadManagers.createDownloadManager(fabricService.get(), executorService);
    Container[] containers = fabricService.get().getContainers();
    for (Container container : containers) {
        Profile[] profiles = container.getProfiles();
        boolean javaOrProcessContainer = ChildContainers.isJavaOrProcessContainer(fabricService.get(), container);
        // TODO allow filter on a profile here?
        for (Profile profile : profiles) {
            Profile overlay = profileService.getOverlayProfile(profile);
            ProfileVersionKey key = new ProfileVersionKey(profile);
            // if (!profileArtifacts.containsKey(key)) {
            Map<String, Parser> artifacts = null;
            if (javaOrProcessContainer) {
                List<Profile> singletonList = Collections.singletonList(profile);
                artifacts = JavaContainers.getJavaContainerArtifacts(fabricService.get(), singletonList, executorService);
            } else {
                artifacts = AgentUtils.getProfileArtifacts(fabricService.get(), downloadManager, overlay);
            }
            if (artifacts != null) {
                if (LOG.isDebugEnabled()) {
                    LOG.debug("Profile " + profile.getId() + " maps to artefacts: " + artifacts.keySet());
                }
                profileArtifacts.put(key, artifacts);
            }
        // }
        }
    }
    return profileArtifacts;
}
Also used : HashMap(java.util.HashMap) DownloadManager(io.fabric8.agent.download.DownloadManager) Profile(io.fabric8.api.Profile) Parser(io.fabric8.maven.util.Parser) Container(io.fabric8.api.Container) ProfileService(io.fabric8.api.ProfileService) Map(java.util.Map) HashMap(java.util.HashMap)

Example 2 with ProfileVersionKey

use of io.fabric8.agent.commands.support.ProfileVersionKey in project fabric8 by jboss-fuse.

the class WatchAction method doExecute.

@Override
protected Object doExecute() throws Exception {
    if (start && stop) {
        System.err.println("Please use only one of --start and --stop options!");
        return null;
    }
    if (interval > 0) {
        System.out.println("Setting watch interval to " + interval + " ms");
        watcher.setInterval(interval);
    }
    if (stop) {
        System.out.println("Stopping watch");
        watcher.stop();
    }
    watcher.setUpload(upload);
    if (urls != null) {
        if (remove) {
            for (String url : urls) {
                watcher.remove(url);
            }
        } else {
            for (String url : urls) {
                watcher.add(url);
            }
        }
    }
    if (start) {
        System.out.println("Starting watch");
        watcher.start();
    }
    if (list) {
        // list the watched bundles.
        TablePrinter printer = new TablePrinter();
        printer.columns("url", "profile", "version", "bundle");
        for (String url : watcher.getWatchURLs()) {
            Map<ProfileVersionKey, Map<String, Parser>> profileArtifacts = watcher.getProfileArtifacts();
            if (profileArtifacts.size() > 0) {
                Set<Map.Entry<ProfileVersionKey, Map<String, Parser>>> entries = profileArtifacts.entrySet();
                for (Map.Entry<ProfileVersionKey, Map<String, Parser>> entry : entries) {
                    ProfileVersionKey key = entry.getKey();
                    Map<String, Parser> artifactMap = entry.getValue();
                    Set<Map.Entry<String, Parser>> artifactMapEntries = artifactMap.entrySet();
                    for (Map.Entry<String, Parser> artifactMapEntry : artifactMapEntries) {
                        String location = artifactMapEntry.getKey();
                        Parser parser = artifactMapEntry.getValue();
                        if (isSnapshot(parser) || watcher.wildCardMatch(location, url)) {
                            printer.row(url, key.getProfileId(), key.getVersion(), location);
                        }
                    }
                }
            } else {
                printer.row(url, "", "", "");
            }
        }
        printer.print();
    } else {
        List<String> urls = watcher.getWatchURLs();
        if (urls != null && urls.size() > 0) {
            System.out.println("Watched URLs: ");
            for (String url : watcher.getWatchURLs()) {
                System.out.println(url);
            }
        } else {
            System.out.println("No watched URLs");
        }
    }
    return null;
}
Also used : ProfileVersionKey(io.fabric8.agent.commands.support.ProfileVersionKey) Parser(io.fabric8.maven.util.Parser) TablePrinter(io.fabric8.utils.TablePrinter) Map(java.util.Map)

Example 3 with ProfileVersionKey

use of io.fabric8.agent.commands.support.ProfileVersionKey in project fabric8 by jboss-fuse.

the class ProfileWatcherImpl method run.

public void run() {
    assertValid();
    LOG.debug("Profile watcher thread started");
    int oldCounter = -1;
    SortedSet<String> oldActiveProfiles = null;
    Map<File, Long> localChecksums = new HashMap<File, Long>();
    Map<File, Long> localModified = new HashMap<File, Long>();
    Set<Profile> refreshProfiles = new HashSet<Profile>();
    ProfileService profileService = fabricService.get().adapt(ProfileService.class);
    while (running.get() && watchURLs.size() > 0) {
        SortedSet<String> currentActiveProfiles = getCurrentActiveProfileVersions();
        if (profileArtifacts == null || oldCounter != counter.get() || oldActiveProfiles == null || !oldActiveProfiles.equals(currentActiveProfiles)) {
            oldCounter = counter.get();
            oldActiveProfiles = currentActiveProfiles;
            try {
                LOG.debug("Reloading the currently active profile artifacts");
                profileArtifacts = findProfileArifacts();
            } catch (Exception e) {
                LOG.error("Failed to get profiles artifacts: " + e, e);
            }
        }
        // lets refresh profiles on the next loop; so we've time to finish uploading/modifying files
        for (Profile profile : refreshProfiles) {
            LOG.info("Refreshing profile: " + profile);
            Profiles.refreshProfile(fabricService.get(), profile);
        }
        refreshProfiles.clear();
        if (profileArtifacts != null) {
            List<File> localRepositories = new LinkedList<>();
            if (mavenResolver.get().getLocalRepository() != null) {
                localRepositories.add(mavenResolver.get().getLocalRepository());
            }
            if (mavenResolver.get().getDefaultRepositories() != null) {
                for (LocalRepository repository : mavenResolver.get().getDefaultRepositories()) {
                    localRepositories.add(repository.getBasedir());
                }
            }
            Set<Map.Entry<ProfileVersionKey, Map<String, Parser>>> entries = profileArtifacts.entrySet();
            for (Map.Entry<ProfileVersionKey, Map<String, Parser>> entry : entries) {
                ProfileVersionKey key = entry.getKey();
                Map<String, Parser> artifactMap = entry.getValue();
                // lets find a container for the profile
                Profile profile = key.getProfile();
                Properties checksums = findProfileChecksums(fabricService.get(), profile);
                if (checksums != null) {
                    Set<Map.Entry<String, Parser>> artifactMapEntries = artifactMap.entrySet();
                    for (Map.Entry<String, Parser> artifactMapEntry : artifactMapEntries) {
                        String location = artifactMapEntry.getKey();
                        Parser parser = artifactMapEntry.getValue();
                        if (isSnapshot(parser) || wildCardMatch(location)) {
                            Object value = checksums.get(location);
                            if (value == null) {
                                value = checksums.get(JavaContainers.removeUriPrefixBeforeMaven(location));
                            }
                            Long checksum = null;
                            if (value instanceof Number) {
                                checksum = ((Number) value).longValue();
                            } else if (value instanceof String) {
                                checksum = Long.parseLong((String) value);
                            }
                            if (checksum == null) {
                                if (missingChecksums.add(location)) {
                                    LOG.warn("Could not find checksum for location " + location);
                                }
                            } else {
                                File file = null;
                                for (File localRepository : localRepositories) {
                                    File _file = new File(localRepository.getPath() + File.separator + parser.getArtifactPath());
                                    if (_file.isFile()) {
                                        file = _file;
                                        break;
                                    }
                                }
                                if (!file.exists()) {
                                    LOG.info("Ignoring file " + file.getPath() + " as it does not exist");
                                } else {
                                    // lets use a cache of last modified times to avoid having to continuously
                                    // recalculate the checksum on each file
                                    Long oldModfied = localModified.get(file);
                                    long modified = file.lastModified();
                                    if (oldModfied == null || modified != oldModfied) {
                                        localModified.put(file, modified);
                                        Long fileChecksum = getFileChecksum(file);
                                        if (fileChecksum != null && !fileChecksum.equals(checksum)) {
                                            // lets keep track of local checksums in case we've already started the upload process
                                            // and it takes the profile a little while to respond to uploaded jars and to
                                            // refreshed profiles
                                            Long localChecksum = localChecksums.get(file);
                                            if (localChecksum == null || !localChecksum.equals(fileChecksum)) {
                                                localChecksums.put(file, fileChecksum);
                                                LOG.info("Checksums don't match for " + location + ", container: " + checksum + " and local file: " + fileChecksum);
                                                LOG.info("Updated version of " + location + " detected in " + file);
                                                if (isUpload()) {
                                                    uploadFile(location, parser, file);
                                                }
                                                refreshProfiles.add(profile);
                                            }
                                        }
                                    }
                                }
                            }
                        } else {
                            if (LOG.isTraceEnabled()) {
                                LOG.trace("Ignoring " + location);
                            }
                        }
                    }
                }
            }
        }
        try {
            Thread.sleep(interval);
        } catch (InterruptedException ex) {
            running.set(false);
        }
    }
    if (LOG.isDebugEnabled()) {
        LOG.debug("Profile watcher thread stopped");
    }
}
Also used : HashMap(java.util.HashMap) Properties(java.util.Properties) Profile(io.fabric8.api.Profile) HashSet(java.util.HashSet) LocalRepository(org.eclipse.aether.repository.LocalRepository) MalformedURLException(java.net.MalformedURLException) IOException(java.io.IOException) LinkedList(java.util.LinkedList) Parser(io.fabric8.maven.util.Parser) ProfileService(io.fabric8.api.ProfileService) File(java.io.File) Map(java.util.Map) HashMap(java.util.HashMap)

Aggregations

Parser (io.fabric8.maven.util.Parser)3 Map (java.util.Map)3 Profile (io.fabric8.api.Profile)2 ProfileService (io.fabric8.api.ProfileService)2 HashMap (java.util.HashMap)2 ProfileVersionKey (io.fabric8.agent.commands.support.ProfileVersionKey)1 DownloadManager (io.fabric8.agent.download.DownloadManager)1 Container (io.fabric8.api.Container)1 TablePrinter (io.fabric8.utils.TablePrinter)1 File (java.io.File)1 IOException (java.io.IOException)1 MalformedURLException (java.net.MalformedURLException)1 HashSet (java.util.HashSet)1 LinkedList (java.util.LinkedList)1 Properties (java.util.Properties)1 LocalRepository (org.eclipse.aether.repository.LocalRepository)1