From d6eaebbbe60cbdb504f691f0692bbe042f558afe Mon Sep 17 00:00:00 2001 From: Kunal Aswani Date: Fri, 5 Apr 2024 10:22:46 -0400 Subject: [PATCH 01/44] HPCC-31476 BS Translations 9.6.x Translations added for Bosnian (BS). Signed-off-by: Kunal Aswani --- esp/src/src/nls/bs/hpcc.ts | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/esp/src/src/nls/bs/hpcc.ts b/esp/src/src/nls/bs/hpcc.ts index 9cf35e59f1a..7a4097a5a93 100644 --- a/esp/src/src/nls/bs/hpcc.ts +++ b/esp/src/src/nls/bs/hpcc.ts @@ -56,8 +56,10 @@ AppendCluster: "Dodajte Klaster", Apply: "Primjenite", Apps: "Aplikacije", + ArchiveDFUWorkunit: "Arhiviraj DFU radnu jedinicu", ArchivedOnly: "Samo Arhiviran", ArchivedWarning: "Upozorenje: koristite kratak vremenski period. Ako koristite duži vremenski period, pretraživanje radnih jedinica može trajati duže od dozviljenog vremena za pretraživanje .", + ArchiveECLWorkunit: "Arhiviraj ECL radnu jedinicu", AreYouSureYouWantToResetTheme: "Jeste li sigurni da se želite vratiti na zadanu temu", Attach: "Prikačite", Attribute: "Atribut", @@ -69,6 +71,8 @@ AutoRefreshEvery: "Automatsko osvježivanje svakih x minuta", AutoRefreshIncrement: "Automatski korak osvježivanja", Back: "Nazad", + BackupDFUWorkunit: "Rezervna DFU radna jedinica", + BackupECLWorkunit: "Rezervna ECL radna jedinica", BannerColor: "Boja Reklamnog Bloka", BannerColorTooltip: "Promijenite boju pozadine gornje navigacije", BannerMessage: "Poruka za Reklamni Blok", @@ -87,6 +91,7 @@ BoundBy: "ograničen sa:", Branches: "Grane", BrowserStats: "Statistika Pregledača", + BuildDate: "Datum izgradnje", Busy: "Zauzet", CallerID: "ID Pozivaoca", Cancel: "Poništite", @@ -160,6 +165,7 @@ CopyWUIDs: "Kopiraj WUID-ove u klipbord", CopyWUIDToClipboard: "Kopirajte WUID u klipbord", Cost: "Cijena", + Costs: "Cijena", Count: "Izbrojte", CountFailed: "Brojanje nije uspjelo", CountTotal: "Ukupan broj", @@ -254,6 +260,7 @@ DownloadSelectionAsCSV: "Preuzmite odabir kao CSV", DownloadToCSV: "Preuzmite u CSV formatu", DownloadToCSVNonFlatWarning: "Napomena: preuzimanje datoteka koje sadrže ugniježđene skupove podataka kao podatke razdvojene zarezima možda neće biti formatirani kako se očekuje", + DownloadToDOT: "Preuzmi na DOT", DropZone: "Zona Prijema", DueToInctivity: "Bićete odjavljeni iz svih ECL Watch sesija za 3 minuta zbog neaktivnosti.", Duration: "Trajanje", @@ -329,6 +336,7 @@ FileParts: "Dio Datoteke", FilePath: "Lokacija Datoteke", FilePermission: "Dozvola Za Pristup Datoteci", + FilePermissionError: "Došlo je do greške prilikom pristupa datoteci dozvola", Files: "Datoteke", FileScopeDefaultPermissions: "Unaprijed Definisane Dozvole za Prostor Datoteka", FileScopes: "Skop Datoteka", @@ -367,12 +375,14 @@ GetDFSCSV: "DFS CSV", GetDFSMap: "DFS Mapa", GetDFSParents: "DFS Roditelji", + GetLastServerMessage: "Preuzmi posljednju poruku servera", GetLogicalFile: "Logički Fajl", GetLogicalFilePart: "Logički Dio Fajla", GetPart: "Dobavite Dio", GetProtectedList: "Zaštićena Lista", GetSoftwareInformation: "Želite li dobiti informacije o softveru", GetValue: "Vrijednost", + GetVersion: "Preuzmi verziju", Graph: "Graf", GraphControl: "Kontrola Grafova", Graphs: "Grafikoni", @@ -437,6 +447,7 @@ Largest: "Najveći", LargestFile: "Najveća Datoteka", LargestSize: "Najveća veličina", + LastAccessed: "Posljednji pristup", LastEdit: "Poslednja Izmjena", LastEditedBy: "Autor Poslednje Izmjene", LastEditTime: "Vrijeme Poslednje Izmjene", @@ -446,6 +457,7 @@ LastNHours: "Posljednjih N Sati", LastNRows: "Posljednjih N Redova", LastRun: "Zadnji Ran", + LatestReleases: "Najnovija izdanja", Layout: "Raspored", LDAPWarning: "Greška LDAP Servica: ‘Previše korisnika’ - Molimo koristite filter.", LearnMore: "Naučite više", @@ -573,6 +585,7 @@ NextSelection: "Slijedeća Selekcija", NoCommon: "Nema uobičajenog", NoContent: "(Bez sadržaja)", + NoContentPleaseSelectItem: "Nema sadržaja - odaberite stavku", noDataMessage: "...Nema Redova...", Node: "Čvor (Node)", NodeGroup: "Grupa Čvorova", @@ -673,6 +686,7 @@ PlaceholderFirstName: "Jovan", PlaceholderLastName: "Smit", Platform: "Platforma", + PlatformBuildIsNNNDaysOld: "Verzija platforme je stara NNN dana", Playground: "Igralište", PleaseEnableCookies: "ECL Watch zahtijeva da kolačići budu omogućeni za nastavak.", PleaseEnterANumber: "Unestite Broj 1 -", @@ -685,10 +699,13 @@ PleaseSelectATopologyItem: "Izaberite ciljnu platformu, servis ili mašinu.", PleaseSelectAUserOrGroup: "Izaberite Korisnika ili Grupu zajedno sa Imenom Datoteke", PleaseSelectAUserToAdd: "Izaberite korisnika kojeg želite da dodate", + PleaseUpgradeToLaterPointRelease: "Molimo nadogradite na kasnije izdanje", Plugins: "Dopune", + PodName: "Naziv pod-a", Pods: "Grupe Kontejnera", PodsAccessError: "Nije moguće dohvatiti listu Podova", Port: "Port", + PotentialSavings: "Potencijalne uštede", Prefix: "Prefiks", PrefixPlaceholder: "filename{:length}, filesize{:[B|L][1-8]}", Preflight: "Provjera prije isporuke", @@ -760,6 +777,7 @@ RemoteCopy: "Kopija sa udaljenog servera", RemoteDali: "Daleki Dali", RemoteDaliIP: "Daleki Dali IP Adresa", + RemoteStorage: "Udaljena pohrana", Remove: "Uklonite", RemoveAttributeQ: "Izabrani atribut će biti uklonjen. Da li ste sigurni da to želite?", RemoveAtttributes: "Uklonite Atribut(e)", @@ -792,6 +810,8 @@ Restarted: "Ponovo Pokternut", Restarts: "Ponovno pokretanje", Restore: "Vratite na Staro Stanje", + RestoreDFUWorkunit: "Vrati DFU radnu jedinicu", + RestoreECLWorkunit: "Vrati ECL radnu jedinicu", Restricted: "Ograničen", Resubmit: "Ponovo Podnesite", Resubmitted: "Ponovo Poslat", @@ -812,6 +832,7 @@ Sample: "Primjer", SampleRequest: "Primjer Zahtjeva", SampleResponse: "Primjer Odgovora", + Sasha: "Saša", Save: "Sačuvajte", Scope: "Područje", SearchResults: "Rezultati Pretraživanja", @@ -821,6 +842,8 @@ SecurityWarning: "Sigurnosno Upozorenje", SeeConfigurationManager: "Pogledajte konfiguiraciju", SelectA: "Odaberite", + SelectAnOption: "Odaberite opciju", + Selected: "Odabrano", SelectEllipsis: "Odaberite ...", SelectPackageFile: "Izaberi Paket", SelectValue: "Odaberite vrijednost", @@ -878,6 +901,7 @@ Starting: "Polazak", StartTime: "Vrijeme početka", State: "Stanje", + Statistics: "Statistika", Stats: "Statistike", Status: "Status", Stopped: "Zaustavljen", @@ -918,6 +942,7 @@ TargetClustersLegacy: "Ciljni Klaster (Kako je ranije bilo)", TargetName: "Naziv Cilja", TargetNamePlaceholder: "neko::logicko::ime", + TargetPlane: "Destinacija za posao", TargetRowTagRequired: "Morate označiti ciljni red u tabeli", Targets: "Ciljne Platforme", TargetScope: "Ciljni Opseg", From 24d674dfb145e222e74e01ba4fbf8411eb37c986 Mon Sep 17 00:00:00 2001 From: Kunal Aswani Date: Fri, 5 Apr 2024 10:33:03 -0400 Subject: [PATCH 02/44] HPCC-31479 HR Translations 9.6.x Translations added Hungarian (HR). Signed-off-by: Kunal Aswani --- esp/src/src/nls/hr/hpcc.ts | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/esp/src/src/nls/hr/hpcc.ts b/esp/src/src/nls/hr/hpcc.ts index 8a6cbfee0cf..72c1c4b2558 100644 --- a/esp/src/src/nls/hr/hpcc.ts +++ b/esp/src/src/nls/hr/hpcc.ts @@ -56,8 +56,10 @@ AppendCluster: "Dodajte Klaster", Apply: "Primjenite", Apps: "Aplikacije", + ArchiveDFUWorkunit: "Arhiviraj radnu jedinicu DFU", ArchivedOnly: "Samo Arhiviran", ArchivedWarning: "Upozorenje: koristite kratak vremenski period. Ako koristite duži vremenski period, pretraživanje radnih jedinica može trajati duže od dozviljenog vremena za pretraživanje .", + ArchiveECLWorkunit: "Arhiviraj radnu jedinicu ECL", AreYouSureYouWantToResetTheme: "Jeste li sigurni da se želite vratiti na zadanu temu", Attach: "Prikačite", Attribute: "Atribut", @@ -69,6 +71,8 @@ AutoRefreshEvery: "Automatsko osvježivanje svakih x minuta", AutoRefreshIncrement: "Automatski korak osvježivanja", Back: "Natrag", + BackupDFUWorkunit: "Sigurnosna DFU radna jedinica", + BackupECLWorkunit: "Sigurnosna ECL radna jedinica", BannerColor: "Boja Reklamnog Bloka", BannerColorTooltip: "Promijenite boju pozadine gornje navigacije", BannerMessage: "Poruka za Reklamni Blok", @@ -87,6 +91,7 @@ BoundBy: "ograničen sa:", Branches: "Grane", BrowserStats: "Statistika Preglednika", + BuildDate: "Datum gradnje", Busy: "Zauzet", CallerID: "ID Pozivatelja", Cancel: "Poništite", @@ -160,6 +165,7 @@ CopyWUIDs: "Kopiraj WUID-ove u međuspremnik", CopyWUIDToClipboard: "Kopirajte WUID u međuspremnik", Cost: "Cijena", + Costs: "Cijena", Count: "Izbrojte", CountFailed: "Brojanje nije uspjelo", CountTotal: "Ukupan broj", @@ -254,6 +260,7 @@ DownloadSelectionAsCSV: "Preuzmite odabir kao CSV", DownloadToCSV: "Preuzmite u CSV formatu", DownloadToCSVNonFlatWarning: "Napomena: preuzimanje datoteka koje sadrže ugniježđene skupove podataka kao podatke odvojene zarezima možda neće biti formatirane kako se očekuje", + DownloadToDOT: "Preuzmi na DOT", DropZone: "Zona Prijema", DueToInctivity: "Bit ćete odjavljeni iz svih ECL Watch sjednica za 3 minute zbog neaktivnosti.", Duration: "Trajanje", @@ -329,6 +336,7 @@ FileParts: "Dio Datoteke", FilePath: "Lokacija Datoteke", FilePermission: "Dozvola Za Pristup Datoteci", + FilePermissionError: "Došlo je do pogreške prilikom pristupa fajlu sa dozvolama", Files: "Datoteke", FileScopeDefaultPermissions: "Unaprijed Definisane Dozvole za Prostor Datoteka", FileScopes: "Skop Datoteka", @@ -367,12 +375,14 @@ GetDFSCSV: "DFS CSV", GetDFSMap: "DFS Mapa", GetDFSParents: "DFS Roditelji", + GetLastServerMessage: "Dohvati posljednju poruku poslužitelja", GetLogicalFile: "Logička Datoteka", GetLogicalFilePart: "Logički Dio Datoteke", GetPart: "Dobavite Dio", GetProtectedList: "Zaštićeni Popis", GetSoftwareInformation: "Želite li dobiti informacije o softveru", GetValue: "Vrijednost", + GetVersion: "Preuzmi verziju", Graph: "Graf", GraphControl: "Kontrola Grafikona", Graphs: "Grafikoni", @@ -437,6 +447,7 @@ Largest: "Najveći", LargestFile: "Najveća Datoteka", LargestSize: "Najveća veličina", + LastAccessed: "Zadnji pristup", LastEdit: "Posljednja Izmjena", LastEditedBy: "Autor Zadnje Izmjene", LastEditTime: "Vrijeme Posljednje Izmjene", @@ -446,6 +457,7 @@ LastNHours: "Posljednjih N Sati", LastNRows: "Posljednjih N Redova", LastRun: "Zadnji Ran", + LatestReleases: "Najnovija izdanja", Layout: "Raspored", LDAPWarning: "Greška LDAP Servica: ‘Previše korisnika’ - Molimo koristite filter.", LearnMore: "Naučite više", @@ -573,6 +585,7 @@ NextSelection: "Sljedeći Odabir", NoCommon: "Nema uobičajenog", NoContent: "(Bez sadržaja)", + NoContentPleaseSelectItem: "Nema sadržaja - odaberite stavku", noDataMessage: "...Nema Redova...", Node: "Čvor (Node)", NodeGroup: "Grupa Čvorova", @@ -673,6 +686,7 @@ PlaceholderFirstName: "Jovan", PlaceholderLastName: "Smit", Platform: "Platforma", + PlatformBuildIsNNNDaysOld: "Verzija platforme je stara NNN dana", Playground: "Igralište", PleaseEnableCookies: "ECL Watch zahtijeva da kolačići budu omogućeni za nastavak.", PleaseEnterANumber: "Unestite Broj 1 -", @@ -685,10 +699,13 @@ PleaseSelectATopologyItem: "Izaberite ciljnu platformu, servis ili mašinu.", PleaseSelectAUserOrGroup: "Izaberite Korisnika ili Grupu zajedno sa Imenom Datoteke", PleaseSelectAUserToAdd: "Izaberite korisnika koga želite da dodate", + PleaseUpgradeToLaterPointRelease: "Molimo koristite noviji point rilis", Plugins: "Dodatci", + PodName: "Naziv pod-a", Pods: "Grupe Kontejnera", PodsAccessError: "Nije moguće dohvatiti popis podova", Port: "Port", + PotentialSavings: "Potencijalne uštede", Prefix: "Prefiks", PrefixPlaceholder: "filename{:length}, filesize{:[B|L][1-8]}", Preflight: "Provjera prije isporuke", @@ -760,6 +777,7 @@ RemoteCopy: "Kopija sa udaljenog servera", RemoteDali: "Daleki Dali", RemoteDaliIP: "Daleki Dali IP Adresa", + RemoteStorage: "Udaljena pohrana", Remove: "Uklonite", RemoveAttributeQ: "Izabrani atribut će biti uklonjen. Da li ste sigurni da to želite?", RemoveAtttributes: "Uklonite Atribut(e)", @@ -792,6 +810,8 @@ Restarted: "Ponovo Pokternut", Restarts: "Ponovno pokretanje", Restore: "Vratite na Staro Stanje", + RestoreDFUWorkunit: "Vrati DFU radnu jedinicu", + RestoreECLWorkunit: "Vrati ECL radnu jedinicu", Restricted: "Ograničen", Resubmit: "Ponovo Podnesite", Resubmitted: "Ponovo Poslat", @@ -812,6 +832,7 @@ Sample: "Primjer", SampleRequest: "Primjer Zahtjeva", SampleResponse: "Primjer Odgovora", + Sasha: "Saša", Save: "Sačuvajte", Scope: "Područje", SearchResults: "Rezultati Pretraživanja", @@ -821,6 +842,8 @@ SecurityWarning: "Sigurnosno Upozorenje", SeeConfigurationManager: "Pogledajte konfiguiraciju", SelectA: "Odaberite", + SelectAnOption: "Odaberite opciju", + Selected: "Odabran", SelectEllipsis: "Odaberite ...", SelectPackageFile: "Izaberi Paket", SelectValue: "Odaberite vrijednost", @@ -878,6 +901,7 @@ Starting: "Polazak", StartTime: "Vrijeme početka", State: "Stanje", + Statistics: "Statistika", Stats: "Statistike", Status: "Status", Stopped: "Zaustavljen", @@ -918,6 +942,7 @@ TargetClustersLegacy: "Ciljni klaster (kao ranije)", TargetName: "Naziv Cilja", TargetNamePlaceholder: "neko::logicko::ime", + TargetPlane: "Odrediste za rad", TargetRowTagRequired: "Morate označiti ciljni red u tabeli", Targets: "Ciljne Platforme", TargetScope: "Ciljni Opseg", From 9d4835f78689a647e45160d25fd188db1d16ee2d Mon Sep 17 00:00:00 2001 From: Kunal Aswani Date: Fri, 5 Apr 2024 10:45:01 -0400 Subject: [PATCH 03/44] HPCC-31481 SR Translations 9.6.x Translations added for Serbian (SR). Signed-off-by: Kunal Aswani --- esp/src/src/nls/sr/hpcc.ts | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/esp/src/src/nls/sr/hpcc.ts b/esp/src/src/nls/sr/hpcc.ts index 62ef1336e4c..a1924b198c1 100644 --- a/esp/src/src/nls/sr/hpcc.ts +++ b/esp/src/src/nls/sr/hpcc.ts @@ -56,8 +56,10 @@ AppendCluster: "Додајте Кластер", Apply: "Примените", Apps: "Апликације", + ArchiveDFUWorkunit: "Архивирај ДФУ радну јединицу", ArchivedOnly: "Само Архивиран", ArchivedWarning: "Упозорење: користите кратак временски период. Ако користите дужи временски период, претраживање радних јединица може трајати дуже од дозвиљеног времена за претраживање.", + ArchiveECLWorkunit: "Архивирај ЕЦЛ радну јединицу", AreYouSureYouWantToResetTheme: "Јесте ли сигурни да се желите вратити на задану тему", Attach: "Причврстите", Attribute: "Атрибут", @@ -69,6 +71,8 @@ AutoRefreshEvery: "Аутоматско освеживање сваких к минута", AutoRefreshIncrement: "Аутоматски корак освежавања", Back: "Назад", + BackupDFUWorkunit: "Резервна ДФУ радна јединица", + BackupECLWorkunit: "Резервна ЕЦЛ радна јединица", BannerColor: "Боја Рекламног Блока", BannerColorTooltip: "Промените боју позадине горње навигације", BannerMessage: "Порука за Рекламни Блок", @@ -87,6 +91,7 @@ BoundBy: "ограничено од:", Branches: "Филијале", BrowserStats: "Статистика Прегледача", + BuildDate: "Датум изградње", Busy: "заузет", CallerID: "ИД позиваоца", Cancel: "Поништите", @@ -161,6 +166,7 @@ CopyWUIDs: "Копирај ВУИД-ове у клипборд", CopyWUIDToClipboard: "Копирај ВУИД у клипборд", Cost: "Цена", + Costs: "Цене", Count: "Избројте", CountFailed: "Бројање није успело", CountTotal: "Укупно броји", @@ -255,6 +261,7 @@ DownloadSelectionAsCSV: "Преузми избор као ЦСВ", DownloadToCSV: "Преузмите у ЦСВ формату", DownloadToCSVNonFlatWarning: "Напомена: преузимање датотека које садрже угнежђене скупове података као податке раздвојене зарезима можда неће бити форматирано како је очекивано", + DownloadToDOT: "Преузми на ДОТ", DropZone: "Зона Пријема", DueToInctivity: "Бићете одјављени из свих ЕЦЛ Вач сесија за 3 минута због неактивности.", Duration: "Трајање", @@ -330,6 +337,7 @@ FileParts: "Дио Датотеке", FilePath: "Локација Датотеке", FilePermission: "Дозвола за приступ фајлу", + FilePermissionError: "Дошло је до грешке приликом приступа датотеци дозвола", Files: "Датотеке", FileScopeDefaultPermissions: "Предефинисанe дозволе за простор Фајлова", FileScopes: "Скоп Датотека", @@ -368,12 +376,14 @@ GetDFSCSV: "ДФС ЦСВ", GetDFSMap: "ДФС Mапа", GetDFSParents: "ДФС Родитељи", + GetLastServerMessage: "Преузми последњу поруку сервера", GetLogicalFile: "Логички Фајл", GetLogicalFilePart: "Део Логичке Датотеке", GetPart: "Добавите Део", GetProtectedList: "Заштићена Листа", GetSoftwareInformation: "Желите ли да добијетe информације о софтверу", GetValue: "Вредност", + GetVersion: "Преузмите верзију", Graph: "Граф", GraphControl: "Контрола графика", Graphs: "Графикони", @@ -438,6 +448,7 @@ Largest: "Највећи", LargestFile: "Највећа Датотека", LargestSize: "Највећа величина", + LastAccessed: "Последњи приступ", LastEdit: "Последња измена", LastEditedBy: "Аутор последње измене", LastEditTime: "Време последњих промена", @@ -447,6 +458,7 @@ LastNHours: "Последњих Н Сати", LastNRows: "Последњих Н Редова", LastRun: "Задњи Ран", + LatestReleases: "Најновија издања", Layout: "Распоред", LDAPWarning: "<б>Грешка ЛДАП Сервица: ‘Превише корисника’ - Молимо користите филтер.", LearnMore: "Научите више", @@ -574,6 +586,7 @@ NextSelection: "Следећи Избор", NoCommon: "Није уобичајено", NoContent: "(Без садржаја)", + NoContentPleaseSelectItem: "Нема садржаја - изаберите ставку", noDataMessage: "...Нема Редова...", Node: "Чвор (Нод)", NodeGroup: "Група Чворова", @@ -674,6 +687,7 @@ PlaceholderFirstName: "Џон", PlaceholderLastName: "Смит", Platform: "Платформа", + PlatformBuildIsNNNDaysOld: "Верзија платформе је стара ННН дана", Playground: "Игралиште", PleaseEnableCookies: "ЕЦЛ Вач захтијева да колачићи буду омогућени за наставак", PleaseEnterANumber: "Унестите Број 1 -", @@ -686,10 +700,13 @@ PleaseSelectATopologyItem: "Одаберите циљну платформу, сервис или машину.", PleaseSelectAUserOrGroup: "Изаберите Корисника или Групу заједно са Именом Фајла", PleaseSelectAUserToAdd: "Изаберите корисника којeг желите да додате", + PleaseUpgradeToLaterPointRelease: "Пређите на касније издање", Plugins: "Допуне", + PodName: "Подназив", Pods: "Групе контејнера", PodsAccessError: "Није могуће преузети листу подова", Port: "Порт", + PotentialSavings: "Потенцијалне уштеде", Prefix: "Префикс", PrefixPlaceholder: "имедатотеке{:дужина}, величинадатотеке{:[B|L][1-8]}", Preflight: "Провера пре испоруке", @@ -761,6 +778,7 @@ RemoteCopy: "Копија са удаљеног сервера", RemoteDali: "Далеки Дали", RemoteDaliIP: "Далеки Дали ИП Адреса", + RemoteStorage: "Даљинско складиштење", Remove: "Уклоните", RemoveAttributeQ: "Изабрани атрибута ће бити уклоњен. Да ли сте сигурни да то желите?", RemoveAtttributes: "Уклоните Атрибут(е)", @@ -793,6 +811,8 @@ Restarted: "Поново Поктернут", Restarts: "Поново покрени", Restore: "Вратите на Старо Стање", + RestoreDFUWorkunit: "Врати ДФУ радну јединицу", + RestoreECLWorkunit: "Врати ЕЦЛ радну јединицу", Restricted: "Ограничен", Resubmit: "Поново Поднесите", Resubmitted: "Поново Послат", @@ -813,6 +833,7 @@ Sample: "Пример", SampleRequest: "Пример Захтева", SampleResponse: "Пример Одговора", + Sasha: "Саша", Save: "Сачувајте", Scope: "Подручје", SearchResults: "Резултати Претраживања", @@ -822,6 +843,8 @@ SecurityWarning: "Безбедносно упозорење", SeeConfigurationManager: "Погледајте конфигурацију", SelectA: "Изаберите", + SelectAnOption: "Изаберите опцију", + Selected: "Изабрано", SelectEllipsis: "Изабери ...", SelectPackageFile: "Изаберитe Пакет", SelectValue: "Изаберите вредност", @@ -879,6 +902,7 @@ Starting: "Полазак", StartTime: "Почетно време", State: "Стање", + Statistics: "Статистика", Stats: "Статистике", Status: "Статус", Stopped: "Заустављен", @@ -919,6 +943,7 @@ TargetClustersLegacy: "Циљни кластер (као раније)", TargetName: "Назив Циља", TargetNamePlaceholder: "неко::логићко::име", + TargetPlane: "Дестинација за посао", TargetRowTagRequired: "Морате ознацити циљни ред у табели", Targets: "Циљне Платформе", TargetScope: "Циљни Обим", From 510586202b736ee5782e0f77e827bcb00fd8d850 Mon Sep 17 00:00:00 2001 From: Gordon Smith Date: Thu, 11 Apr 2024 17:37:10 +0100 Subject: [PATCH 04/44] Split off 9.0.100 Signed-off-by: Gordon Smith --- helm/hpcc/Chart.yaml | 4 ++-- helm/hpcc/templates/_helpers.tpl | 2 +- helm/hpcc/templates/dafilesrv.yaml | 2 +- helm/hpcc/templates/dali.yaml | 2 +- helm/hpcc/templates/dfuserver.yaml | 2 +- helm/hpcc/templates/eclagent.yaml | 4 ++-- helm/hpcc/templates/eclccserver.yaml | 4 ++-- helm/hpcc/templates/eclscheduler.yaml | 2 +- helm/hpcc/templates/esp.yaml | 2 +- helm/hpcc/templates/localroxie.yaml | 2 +- helm/hpcc/templates/roxie.yaml | 8 ++++---- helm/hpcc/templates/sasha.yaml | 2 +- helm/hpcc/templates/thor.yaml | 10 +++++----- version.cmake | 4 ++-- 14 files changed, 25 insertions(+), 25 deletions(-) diff --git a/helm/hpcc/Chart.yaml b/helm/hpcc/Chart.yaml index 4c4c7466d7b..d4ea3263062 100644 --- a/helm/hpcc/Chart.yaml +++ b/helm/hpcc/Chart.yaml @@ -6,9 +6,9 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. -version: 9.0.99-closedown0 +version: 9.0.101-closedown0 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. -appVersion: 9.0.99-closedown0 +appVersion: 9.0.101-closedown0 diff --git a/helm/hpcc/templates/_helpers.tpl b/helm/hpcc/templates/_helpers.tpl index 54ba8764e52..9cfd6a35e49 100644 --- a/helm/hpcc/templates/_helpers.tpl +++ b/helm/hpcc/templates/_helpers.tpl @@ -1314,7 +1314,7 @@ kind: Service metadata: name: {{ $lvars.serviceName | quote }} labels: - helmVersion: 9.0.99-closedown0 + helmVersion: 9.0.101-closedown0 {{- include "hpcc.addStandardLabels" (dict "root" $.root "instance" $lvars.serviceName ) | indent 4 }} {{- if $lvars.labels }} {{ toYaml $lvars.labels | indent 4 }} diff --git a/helm/hpcc/templates/dafilesrv.yaml b/helm/hpcc/templates/dafilesrv.yaml index 57dcff36d0d..65e1d67ce25 100644 --- a/helm/hpcc/templates/dafilesrv.yaml +++ b/helm/hpcc/templates/dafilesrv.yaml @@ -50,7 +50,7 @@ spec: labels: {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "dafilesrv" "name" "dafilesrv" "instance" .name) | indent 8 }} server: {{ .name | quote }} - helmVersion: 9.0.99-closedown0 + helmVersion: 9.0.101-closedown0 annotations: checksum/config: {{ $configSHA }} spec: diff --git a/helm/hpcc/templates/dali.yaml b/helm/hpcc/templates/dali.yaml index 5af6af90856..b2214b42f9e 100644 --- a/helm/hpcc/templates/dali.yaml +++ b/helm/hpcc/templates/dali.yaml @@ -82,7 +82,7 @@ spec: run: {{ $dali.name | quote }} server: {{ $dali.name | quote }} app: dali - helmVersion: 9.0.99-closedown0 + helmVersion: 9.0.101-closedown0 {{- if hasKey $.Values.global "metrics" }} {{- include "hpcc.generateMetricsReporterLabel" $.Values.global.metrics | nindent 8 }} {{- end }} diff --git a/helm/hpcc/templates/dfuserver.yaml b/helm/hpcc/templates/dfuserver.yaml index 80e21d47aa4..1be81bf7807 100644 --- a/helm/hpcc/templates/dfuserver.yaml +++ b/helm/hpcc/templates/dfuserver.yaml @@ -56,7 +56,7 @@ spec: {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "dfuserver" "name" "dfuserver" "instance" .name) | indent 8 }} run: {{ .name | quote }} accessDali: "yes" - helmVersion: 9.0.99-closedown0 + helmVersion: 9.0.101-closedown0 {{- if hasKey . "labels" }} {{ toYaml .labels | indent 8 }} {{- end }} diff --git a/helm/hpcc/templates/eclagent.yaml b/helm/hpcc/templates/eclagent.yaml index 146737fd16e..c66e6beada4 100644 --- a/helm/hpcc/templates/eclagent.yaml +++ b/helm/hpcc/templates/eclagent.yaml @@ -58,7 +58,7 @@ data: {{- include "hpcc.addStandardLabels" (dict "root" $ "component" $apptype "name" "eclagent" "instance" $appJobName "instanceOf" (printf "%s-job" .me.name)) | indent 12 }} accessDali: "yes" accessEsp: "yes" - helmVersion: 9.0.99-closedown0 + helmVersion: 9.0.101-closedown0 {{- if hasKey .me "labels" }} {{ toYaml .me.labels | indent 12 }} {{- end }} @@ -135,7 +135,7 @@ spec: run: {{ .name | quote }} accessDali: "yes" accessEsp: {{ .useChildProcesses | default false | ternary "yes" "no" | quote }} - helmVersion: 9.0.99-closedown0 + helmVersion: 9.0.101-closedown0 {{- if hasKey . "labels" }} {{ toYaml .labels | indent 8 }} {{- end }} diff --git a/helm/hpcc/templates/eclccserver.yaml b/helm/hpcc/templates/eclccserver.yaml index 16528ada2d2..fdc93f40b43 100644 --- a/helm/hpcc/templates/eclccserver.yaml +++ b/helm/hpcc/templates/eclccserver.yaml @@ -57,7 +57,7 @@ data: {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "eclccserver" "name" "eclccserver" "instance" $compileJobName "instanceOf" (printf "%s-job" .me.name)) | indent 12 }} accessDali: "yes" accessEsp: "yes" - helmVersion: 9.0.99-closedown0 + helmVersion: 9.0.101-closedown0 {{- if hasKey .me "labels" }} {{ toYaml .me.labels | indent 12 }} {{- end }} @@ -142,7 +142,7 @@ spec: run: {{ .name | quote }} accessDali: "yes" accessEsp: {{ .useChildProcesses | default false | ternary "yes" "no" | quote }} - helmVersion: 9.0.99-closedown0 + helmVersion: 9.0.101-closedown0 {{- if hasKey . "labels" }} {{ toYaml .labels | indent 8 }} {{- end }} diff --git a/helm/hpcc/templates/eclscheduler.yaml b/helm/hpcc/templates/eclscheduler.yaml index dda550233f8..8c6b6b823ed 100644 --- a/helm/hpcc/templates/eclscheduler.yaml +++ b/helm/hpcc/templates/eclscheduler.yaml @@ -64,7 +64,7 @@ spec: run: {{ .name | quote }} accessDali: "yes" accessEsp: "no" - helmVersion: 9.0.99-closedown0 + helmVersion: 9.0.101-closedown0 {{- if hasKey . "labels" }} {{ toYaml .labels | indent 8 }} {{- end }} diff --git a/helm/hpcc/templates/esp.yaml b/helm/hpcc/templates/esp.yaml index 58bdab28518..03a816d76d8 100644 --- a/helm/hpcc/templates/esp.yaml +++ b/helm/hpcc/templates/esp.yaml @@ -117,7 +117,7 @@ spec: server: {{ .name | quote }} accessDali: "yes" app: {{ $application }} - helmVersion: 9.0.99-closedown0 + helmVersion: 9.0.101-closedown0 {{- include "hpcc.addStandardLabels" (dict "root" $ "name" $application "component" "esp" "instance" .name) | indent 8 }} {{- if hasKey $.Values.global "metrics" }} {{- include "hpcc.generateMetricsReporterLabel" $.Values.global.metrics | nindent 8 }} diff --git a/helm/hpcc/templates/localroxie.yaml b/helm/hpcc/templates/localroxie.yaml index 77130e0f12e..8602c42f2e2 100644 --- a/helm/hpcc/templates/localroxie.yaml +++ b/helm/hpcc/templates/localroxie.yaml @@ -70,7 +70,7 @@ spec: server: {{ $servername | quote }} accessDali: "yes" accessEsp: "yes" - helmVersion: 9.0.99-closedown0 + helmVersion: 9.0.101-closedown0 {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "roxie-server" "name" "roxie" "instance" $roxie.name) | indent 8 }} {{- if hasKey . "labels" }} {{ toYaml .labels | indent 8 }} diff --git a/helm/hpcc/templates/roxie.yaml b/helm/hpcc/templates/roxie.yaml index acedd9ef4f0..ad79b66cbf8 100644 --- a/helm/hpcc/templates/roxie.yaml +++ b/helm/hpcc/templates/roxie.yaml @@ -120,7 +120,7 @@ spec: {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "topology-server" "name" "roxie" "instance" $commonCtx.toponame) | indent 8 }} run: {{ $commonCtx.toponame | quote }} roxie-cluster: {{ $roxie.name | quote }} - helmVersion: 9.0.99-closedown0 + helmVersion: 9.0.101-closedown0 {{- if hasKey $.Values.global "metrics" }} {{- include "hpcc.generateMetricsReporterLabel" $.Values.global.metrics | nindent 8}} {{- end }} @@ -180,7 +180,7 @@ kind: Service metadata: name: {{ $commonCtx.toponame | quote }} labels: - helmVersion: 9.0.99-closedown0 + helmVersion: 9.0.101-closedown0 {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "topology-server" "name" "roxie" "instance" $commonCtx.toponame) | indent 4 }} spec: ports: @@ -242,7 +242,7 @@ spec: roxie-cluster: {{ $roxie.name | quote }} accessDali: "yes" accessEsp: "yes" - helmVersion: 9.0.99-closedown0 + helmVersion: 9.0.101-closedown0 {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "roxie-server" "name" "roxie" "instance" $servername) | indent 8 }} {{- if hasKey $.Values.global "metrics" }} {{- include "hpcc.generateMetricsReporterLabel" $.Values.global.metrics | nindent 8}} @@ -347,7 +347,7 @@ spec: roxie-cluster: {{ $roxie.name | quote }} accessDali: "yes" accessEsp: "yes" - helmVersion: 9.0.99-closedown0 + helmVersion: 9.0.101-closedown0 {{- if hasKey $.Values.global "metrics" }} {{- include "hpcc.generateMetricsReporterLabel" $.Values.global.metrics | nindent 8}} {{- end }} diff --git a/helm/hpcc/templates/sasha.yaml b/helm/hpcc/templates/sasha.yaml index 8a6939dee83..b553607690d 100644 --- a/helm/hpcc/templates/sasha.yaml +++ b/helm/hpcc/templates/sasha.yaml @@ -52,7 +52,7 @@ spec: run: {{ $serviceName | quote }} server: {{ $serviceName | quote }} accessDali: {{ (has "dali" $sasha.access) | ternary "yes" "no" | quote }} - helmVersion: 9.0.99-closedown0 + helmVersion: 9.0.101-closedown0 {{- if hasKey $sasha "labels" }} {{ toYaml $sasha.labels | indent 8 }} {{- end }} diff --git a/helm/hpcc/templates/thor.yaml b/helm/hpcc/templates/thor.yaml index 6e33342b41b..59ae0021a3e 100644 --- a/helm/hpcc/templates/thor.yaml +++ b/helm/hpcc/templates/thor.yaml @@ -82,7 +82,7 @@ data: labels: accessDali: "yes" accessEsp: "yes" - helmVersion: 9.0.99-closedown0 + helmVersion: 9.0.101-closedown0 {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "eclagent" "name" "thor" "instance" $eclAgentJobName "instanceOf" (printf "%s-job" .eclAgentName)) | indent 8 }} {{- if hasKey .me "labels" }} {{ toYaml .me.labels | indent 12 }} @@ -147,7 +147,7 @@ data: accessEsp: "yes" app: "thor" component: "thormanager" - helmVersion: 9.0.99-closedown0 + helmVersion: 9.0.101-closedown0 instance: "_HPCC_JOBNAME_" job: "_HPCC_JOBNAME_" {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "thormanager" "name" "thor" "instance" $thorManagerJobName "instanceOf" (printf "%s-thormanager-job" .me.name)) | indent 12 }} @@ -214,7 +214,7 @@ data: accessEsp: "yes" app: "thor" component: "thorworker" - helmVersion: 9.0.99-closedown0 + helmVersion: 9.0.101-closedown0 instance: "_HPCC_JOBNAME_" job: "_HPCC_JOBNAME_" {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "thorworker" "name" "thor" "instance" $thorWorkerJobName "instanceOf" (printf "%s-thorworker-job" .me.name)) | indent 12 }} @@ -347,7 +347,7 @@ spec: accessEsp: {{ $commonCtx.eclAgentUseChildProcesses | ternary "yes" "no" | quote }} app: "thor" component: "thor-eclagent" - helmVersion: 9.0.99-closedown0 + helmVersion: 9.0.101-closedown0 instance: {{ $commonCtx.eclAgentName | quote }} {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "eclagent" "name" "thor" "instance" $commonCtx.eclAgentName ) | indent 8 }} {{- if hasKey $commonCtx.me "labels" }} @@ -412,7 +412,7 @@ spec: accessEsp: "no" app: "thor" component: "thor-thoragent" - helmVersion: 9.0.99-closedown0 + helmVersion: 9.0.101-closedown0 instance: {{ $commonCtx.thorAgentName | quote }} {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "eclagent" "name" "thor" "instance" $commonCtx.thorAgentName ) | indent 8 }} {{- if hasKey $commonCtx.me "labels" }} diff --git a/version.cmake b/version.cmake index 8ab60f4286b..24e07fd3da4 100644 --- a/version.cmake +++ b/version.cmake @@ -5,8 +5,8 @@ set ( HPCC_NAME "Community Edition" ) set ( HPCC_PROJECT "community" ) set ( HPCC_MAJOR 9 ) set ( HPCC_MINOR 0 ) -set ( HPCC_POINT 99 ) +set ( HPCC_POINT 101 ) set ( HPCC_MATURITY "closedown" ) set ( HPCC_SEQUENCE 0 ) -set ( HPCC_TAG_TIMESTAMP "2024-04-04T16:04:06Z" ) +set ( HPCC_TAG_TIMESTAMP "2024-04-11T16:37:09Z" ) ### From cafc4379ab14e8b3455a844a62f831261724ba89 Mon Sep 17 00:00:00 2001 From: Gordon Smith Date: Thu, 11 Apr 2024 17:39:31 +0100 Subject: [PATCH 05/44] Split off 8.12.102 Signed-off-by: Gordon Smith --- helm/hpcc/Chart.yaml | 4 ++-- helm/hpcc/templates/_helpers.tpl | 2 +- helm/hpcc/templates/dafilesrv.yaml | 2 +- helm/hpcc/templates/dali.yaml | 2 +- helm/hpcc/templates/dfuserver.yaml | 2 +- helm/hpcc/templates/eclagent.yaml | 4 ++-- helm/hpcc/templates/eclccserver.yaml | 4 ++-- helm/hpcc/templates/eclscheduler.yaml | 2 +- helm/hpcc/templates/esp.yaml | 2 +- helm/hpcc/templates/localroxie.yaml | 2 +- helm/hpcc/templates/roxie.yaml | 8 ++++---- helm/hpcc/templates/sasha.yaml | 2 +- helm/hpcc/templates/thor.yaml | 10 +++++----- version.cmake | 4 ++-- 14 files changed, 25 insertions(+), 25 deletions(-) diff --git a/helm/hpcc/Chart.yaml b/helm/hpcc/Chart.yaml index 1fd4567bf58..753adcc4d4d 100644 --- a/helm/hpcc/Chart.yaml +++ b/helm/hpcc/Chart.yaml @@ -6,9 +6,9 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. -version: 8.12.101-closedown0 +version: 8.12.103-closedown0 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. -appVersion: 8.12.101-closedown0 +appVersion: 8.12.103-closedown0 diff --git a/helm/hpcc/templates/_helpers.tpl b/helm/hpcc/templates/_helpers.tpl index 947c81c531f..15bde3fe840 100644 --- a/helm/hpcc/templates/_helpers.tpl +++ b/helm/hpcc/templates/_helpers.tpl @@ -1240,7 +1240,7 @@ kind: Service metadata: name: {{ $lvars.serviceName | quote }} labels: - helmVersion: 8.12.101-closedown0 + helmVersion: 8.12.103-closedown0 {{- include "hpcc.addStandardLabels" (dict "root" $.root "instance" $lvars.serviceName ) | indent 4 }} {{- if $lvars.labels }} {{ toYaml $lvars.labels | indent 4 }} diff --git a/helm/hpcc/templates/dafilesrv.yaml b/helm/hpcc/templates/dafilesrv.yaml index 25ff4c65f98..751350e9e2b 100644 --- a/helm/hpcc/templates/dafilesrv.yaml +++ b/helm/hpcc/templates/dafilesrv.yaml @@ -50,7 +50,7 @@ spec: labels: {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "dafilesrv" "name" "dafilesrv" "instance" .name) | indent 8 }} server: {{ .name | quote }} - helmVersion: 8.12.101-closedown0 + helmVersion: 8.12.103-closedown0 annotations: checksum/config: {{ $configSHA }} spec: diff --git a/helm/hpcc/templates/dali.yaml b/helm/hpcc/templates/dali.yaml index 7711b63b6a8..3d77694e8fa 100644 --- a/helm/hpcc/templates/dali.yaml +++ b/helm/hpcc/templates/dali.yaml @@ -82,7 +82,7 @@ spec: run: {{ $dali.name | quote }} server: {{ $dali.name | quote }} app: dali - helmVersion: 8.12.101-closedown0 + helmVersion: 8.12.103-closedown0 {{- if hasKey $.Values.global "metrics" }} {{- include "hpcc.generateMetricsReporterLabel" $.Values.global.metrics | nindent 8 }} {{- end }} diff --git a/helm/hpcc/templates/dfuserver.yaml b/helm/hpcc/templates/dfuserver.yaml index adcd97e8387..9c8209337a1 100644 --- a/helm/hpcc/templates/dfuserver.yaml +++ b/helm/hpcc/templates/dfuserver.yaml @@ -56,7 +56,7 @@ spec: {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "dfuserver" "name" "dfuserver" "instance" .name) | indent 8 }} run: {{ .name | quote }} accessDali: "yes" - helmVersion: 8.12.101-closedown0 + helmVersion: 8.12.103-closedown0 {{- if hasKey . "labels" }} {{ toYaml .labels | indent 8 }} {{- end }} diff --git a/helm/hpcc/templates/eclagent.yaml b/helm/hpcc/templates/eclagent.yaml index 45d92f0b376..61fff3bbba0 100644 --- a/helm/hpcc/templates/eclagent.yaml +++ b/helm/hpcc/templates/eclagent.yaml @@ -58,7 +58,7 @@ data: {{- include "hpcc.addStandardLabels" (dict "root" $ "component" $apptype "name" "eclagent" "instance" $appJobName "instanceOf" (printf "%s-job" .me.name)) | indent 12 }} accessDali: "yes" accessEsp: "yes" - helmVersion: 8.12.101-closedown0 + helmVersion: 8.12.103-closedown0 {{- if hasKey .me "labels" }} {{ toYaml .me.labels | indent 12 }} {{- end }} @@ -137,7 +137,7 @@ spec: run: {{ .name | quote }} accessDali: "yes" accessEsp: {{ .useChildProcesses | default false | ternary "yes" "no" | quote }} - helmVersion: 8.12.101-closedown0 + helmVersion: 8.12.103-closedown0 {{- if hasKey . "labels" }} {{ toYaml .labels | indent 8 }} {{- end }} diff --git a/helm/hpcc/templates/eclccserver.yaml b/helm/hpcc/templates/eclccserver.yaml index 1c0715ccc94..fe382eb195d 100644 --- a/helm/hpcc/templates/eclccserver.yaml +++ b/helm/hpcc/templates/eclccserver.yaml @@ -57,7 +57,7 @@ data: {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "eclccserver" "name" "eclccserver" "instance" $compileJobName "instanceOf" (printf "%s-job" .me.name)) | indent 12 }} accessDali: "yes" accessEsp: "yes" - helmVersion: 8.12.101-closedown0 + helmVersion: 8.12.103-closedown0 {{- if hasKey .me "labels" }} {{ toYaml .me.labels | indent 12 }} {{- end }} @@ -142,7 +142,7 @@ spec: run: {{ .name | quote }} accessDali: "yes" accessEsp: {{ .useChildProcesses | default false | ternary "yes" "no" | quote }} - helmVersion: 8.12.101-closedown0 + helmVersion: 8.12.103-closedown0 {{- if hasKey . "labels" }} {{ toYaml .labels | indent 8 }} {{- end }} diff --git a/helm/hpcc/templates/eclscheduler.yaml b/helm/hpcc/templates/eclscheduler.yaml index d5cb35104bb..be161e2261e 100644 --- a/helm/hpcc/templates/eclscheduler.yaml +++ b/helm/hpcc/templates/eclscheduler.yaml @@ -64,7 +64,7 @@ spec: run: {{ .name | quote }} accessDali: "yes" accessEsp: "no" - helmVersion: 8.12.101-closedown0 + helmVersion: 8.12.103-closedown0 {{- if hasKey . "labels" }} {{ toYaml .labels | indent 8 }} {{- end }} diff --git a/helm/hpcc/templates/esp.yaml b/helm/hpcc/templates/esp.yaml index 25b623fcaa7..63bc85691f0 100644 --- a/helm/hpcc/templates/esp.yaml +++ b/helm/hpcc/templates/esp.yaml @@ -117,7 +117,7 @@ spec: server: {{ .name | quote }} accessDali: "yes" app: {{ $application }} - helmVersion: 8.12.101-closedown0 + helmVersion: 8.12.103-closedown0 {{- include "hpcc.addStandardLabels" (dict "root" $ "name" $application "component" "esp" "instance" .name) | indent 8 }} {{- if hasKey $.Values.global "metrics" }} {{- include "hpcc.generateMetricsReporterLabel" $.Values.global.metrics | nindent 8 }} diff --git a/helm/hpcc/templates/localroxie.yaml b/helm/hpcc/templates/localroxie.yaml index 377f60b15dd..62373febc06 100644 --- a/helm/hpcc/templates/localroxie.yaml +++ b/helm/hpcc/templates/localroxie.yaml @@ -70,7 +70,7 @@ spec: server: {{ $servername | quote }} accessDali: "yes" accessEsp: "yes" - helmVersion: 8.12.101-closedown0 + helmVersion: 8.12.103-closedown0 {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "roxie-server" "name" "roxie" "instance" $roxie.name) | indent 8 }} {{- if hasKey . "labels" }} {{ toYaml .labels | indent 8 }} diff --git a/helm/hpcc/templates/roxie.yaml b/helm/hpcc/templates/roxie.yaml index 111c287412c..cac2a3e5b88 100644 --- a/helm/hpcc/templates/roxie.yaml +++ b/helm/hpcc/templates/roxie.yaml @@ -120,7 +120,7 @@ spec: {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "topology-server" "name" "roxie" "instance" $commonCtx.toponame) | indent 8 }} run: {{ $commonCtx.toponame | quote }} roxie-cluster: {{ $roxie.name | quote }} - helmVersion: 8.12.101-closedown0 + helmVersion: 8.12.103-closedown0 {{- if hasKey $.Values.global "metrics" }} {{- include "hpcc.generateMetricsReporterLabel" $.Values.global.metrics | nindent 8}} {{- end }} @@ -180,7 +180,7 @@ kind: Service metadata: name: {{ $commonCtx.toponame | quote }} labels: - helmVersion: 8.12.101-closedown0 + helmVersion: 8.12.103-closedown0 {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "topology-server" "name" "roxie" "instance" $commonCtx.toponame) | indent 4 }} spec: ports: @@ -242,7 +242,7 @@ spec: roxie-cluster: {{ $roxie.name | quote }} accessDali: "yes" accessEsp: "yes" - helmVersion: 8.12.101-closedown0 + helmVersion: 8.12.103-closedown0 {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "roxie-server" "name" "roxie" "instance" $servername) | indent 8 }} {{- if hasKey $.Values.global "metrics" }} {{- include "hpcc.generateMetricsReporterLabel" $.Values.global.metrics | nindent 8}} @@ -347,7 +347,7 @@ spec: roxie-cluster: {{ $roxie.name | quote }} accessDali: "yes" accessEsp: "yes" - helmVersion: 8.12.101-closedown0 + helmVersion: 8.12.103-closedown0 {{- if hasKey $.Values.global "metrics" }} {{- include "hpcc.generateMetricsReporterLabel" $.Values.global.metrics | nindent 8}} {{- end }} diff --git a/helm/hpcc/templates/sasha.yaml b/helm/hpcc/templates/sasha.yaml index bcbbdc4ab9e..8148a2d6b56 100644 --- a/helm/hpcc/templates/sasha.yaml +++ b/helm/hpcc/templates/sasha.yaml @@ -52,7 +52,7 @@ spec: run: {{ $serviceName | quote }} server: {{ $serviceName | quote }} accessDali: {{ (has "dali" $sasha.access) | ternary "yes" "no" | quote }} - helmVersion: 8.12.101-closedown0 + helmVersion: 8.12.103-closedown0 {{- if hasKey $sasha "labels" }} {{ toYaml $sasha.labels | indent 8 }} {{- end }} diff --git a/helm/hpcc/templates/thor.yaml b/helm/hpcc/templates/thor.yaml index 29a38fde3f8..47c60fec8ec 100644 --- a/helm/hpcc/templates/thor.yaml +++ b/helm/hpcc/templates/thor.yaml @@ -82,7 +82,7 @@ data: labels: accessDali: "yes" accessEsp: "yes" - helmVersion: 8.12.101-closedown0 + helmVersion: 8.12.103-closedown0 {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "eclagent" "name" "thor" "instance" $eclAgentJobName "instanceOf" (printf "%s-job" .eclAgentName)) | indent 8 }} {{- if hasKey .me "labels" }} {{ toYaml .me.labels | indent 12 }} @@ -149,7 +149,7 @@ data: accessEsp: "yes" app: "thor" component: "thormanager" - helmVersion: 8.12.101-closedown0 + helmVersion: 8.12.103-closedown0 instance: "_HPCC_JOBNAME_" job: "_HPCC_JOBNAME_" {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "thormanager" "name" "thor" "instance" $thorManagerJobName "instanceOf" (printf "%s-thormanager-job" .me.name)) | indent 12 }} @@ -218,7 +218,7 @@ data: accessEsp: "yes" app: "thor" component: "thorworker" - helmVersion: 8.12.101-closedown0 + helmVersion: 8.12.103-closedown0 instance: "_HPCC_JOBNAME_" job: "_HPCC_JOBNAME_" {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "thorworker" "name" "thor" "instance" $thorWorkerJobName "instanceOf" (printf "%s-thorworker-job" .me.name)) | indent 12 }} @@ -353,7 +353,7 @@ spec: accessEsp: {{ $commonCtx.eclAgentUseChildProcesses | ternary "yes" "no" | quote }} app: "thor" component: "thor-eclagent" - helmVersion: 8.12.101-closedown0 + helmVersion: 8.12.103-closedown0 instance: {{ $commonCtx.eclAgentName | quote }} {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "eclagent" "name" "thor" "instance" $commonCtx.eclAgentName ) | indent 8 }} {{- if hasKey $commonCtx.me "labels" }} @@ -418,7 +418,7 @@ spec: accessEsp: "no" app: "thor" component: "thor-thoragent" - helmVersion: 8.12.101-closedown0 + helmVersion: 8.12.103-closedown0 instance: {{ $commonCtx.thorAgentName | quote }} {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "eclagent" "name" "thor" "instance" $commonCtx.thorAgentName ) | indent 8 }} {{- if hasKey $commonCtx.me "labels" }} diff --git a/version.cmake b/version.cmake index 2c6778ea517..ea8f09f5071 100644 --- a/version.cmake +++ b/version.cmake @@ -5,8 +5,8 @@ set ( HPCC_NAME "Community Edition" ) set ( HPCC_PROJECT "community" ) set ( HPCC_MAJOR 8 ) set ( HPCC_MINOR 12 ) -set ( HPCC_POINT 101 ) +set ( HPCC_POINT 103 ) set ( HPCC_MATURITY "closedown" ) set ( HPCC_SEQUENCE 0 ) -set ( HPCC_TAG_TIMESTAMP "2024-03-28T17:50:40Z" ) +set ( HPCC_TAG_TIMESTAMP "2024-04-11T16:39:31Z" ) ### From 5a462a79cde6a7eaac30abf0a1076551da57beca Mon Sep 17 00:00:00 2001 From: Gordon Smith Date: Thu, 18 Apr 2024 15:43:23 +0100 Subject: [PATCH 06/44] HPCC-31641 Remove old cmake "FindXXX" modules Causing an issue on some OSX instances Signed-off-by: Gordon Smith --- cmake_modules/FindCBLAS.cmake | 60 --- cmake_modules/FindCOUCHBASE.cmake | 52 --- cmake_modules/FindCPPUNIT.cmake | 74 ---- cmake_modules/FindHIREDIS.cmake | 63 --- cmake_modules/FindMYSQL.cmake | 38 -- cmake_modules/FindOPENLDAP.cmake | 72 ---- cmake_modules/FindSQLITE3.cmake | 41 -- cmake_modules/commonSetup.cmake | 16 +- common/remote/CMakeLists.txt | 2 +- dali/datest/datest.cmake | 2 +- dali/daunittest/CMakeLists.txt | 2 +- ecl/eclagent/CMakeLists.txt | 2 +- ecl/hql/CMakeLists.txt | 2 +- esp/clients/wsdfuaccess/CMakeLists.txt | 2 +- esp/services/ws_access/CMakeLists.txt | 5 - esp/services/ws_account/CMakeLists.txt | 5 - esp/services/ws_cloud/CMakeLists.txt | 5 - esp/services/ws_smc/CMakeLists.txt | 5 - esp/services/ws_workunits/CMakeLists.txt | 2 +- fs/dafsserver/CMakeLists.txt | 2 +- plugins/mysql/CMakeLists.txt | 6 +- plugins/mysql/mysqlembed.cpp | 4 +- roxie/roxiemem/CMakeLists.txt | 2 +- rtl/nbcd/CMakeLists.txt | 2 +- system/jhtree/CMakeLists.txt | 2 +- system/security/LdapSecurity/CMakeLists.txt | 3 +- system/xmllib/CMakeLists.txt | 2 +- testing/unittests/CMakeLists.txt | 2 +- tools/wutool/CMakeLists.txt | 2 +- vcpkg_usage.txt | 426 +++++++++++--------- 30 files changed, 254 insertions(+), 649 deletions(-) delete mode 100644 cmake_modules/FindCBLAS.cmake delete mode 100644 cmake_modules/FindCOUCHBASE.cmake delete mode 100644 cmake_modules/FindCPPUNIT.cmake delete mode 100644 cmake_modules/FindHIREDIS.cmake delete mode 100644 cmake_modules/FindMYSQL.cmake delete mode 100644 cmake_modules/FindOPENLDAP.cmake delete mode 100644 cmake_modules/FindSQLITE3.cmake diff --git a/cmake_modules/FindCBLAS.cmake b/cmake_modules/FindCBLAS.cmake deleted file mode 100644 index c799438cf79..00000000000 --- a/cmake_modules/FindCBLAS.cmake +++ /dev/null @@ -1,60 +0,0 @@ -################################################################################ -# HPCC SYSTEMS software Copyright (C) 2016 HPCC Systems®. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -################################################################################ - -if(NOT CBLAS_FOUND) - if(WIN32) - set(cblas_lib "cblas") - else() - set(cblas_lib cblas tatlas satlas) - endif() - - find_path(CBLAS_INCLUDE_DIR NAMES cblas.h) - find_library(CBLAS_LIBRARIES NAMES ${cblas_lib} PATHS /usr/lib/atlas /usr/lib64/atlas) - - include(FindPackageHandleStandardArgs) - find_package_handle_standard_args(CBLAS - DEFAULT_MSG - CBLAS_LIBRARIES - CBLAS_INCLUDE_DIR) - - if (APPLE AND ${CMAKE_SYSTEM_VERSION} VERSION_LESS "18.2.0") # 18.2.0 is macOS Mojave (10.14) - set(LIB_TO_DO ${CBLAS_LIBRARIES}) - - set(CBLAS_DEPS_LIBS "") - foreach (lib libquadmath;libgfortran;libgcc_s) - message("otool -L ${LIB_TO_DO} | egrep ${lib}(.[0-9]{1,})*.dylib | sed \"s/^[[:space:]]//g\" | cut -d' ' -f1") - execute_process( - COMMAND bash "-c" "otool -L \"${LIB_TO_DO}\" | egrep \"${lib}(.[0-9]{1,})*.dylib\" | sed \"s/^[[:space:]]//g\" | cut -d' ' -f1" - OUTPUT_VARIABLE otoolOut - ERROR_VARIABLE otoolErr - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - if (NOT "${otoolErr}" STREQUAL "") - message(FATAL_ERROR "Failed to check dependent lib ${lib} for ${LIB_TO_DO}") - endif() - - if ("${otoolOut}" STREQUAL "") - message(FATAL_ERROR "${LIB_TO_DO} dependencies changed. Run otool -L check manually and update file FindCBLAS.cmake") - endif() - list(APPEND CBLAS_DEPS_LIBS ${otoolOut}) - if ("${otoolOut}" MATCHES ".*libgfortran.*") - set(LIB_TO_DO "${otoolOut}") - endif() - endforeach() - endif() - - mark_as_advanced(CBLAS_INCLUDE_DIR CBLAS_LIBRARIES) -endif() diff --git a/cmake_modules/FindCOUCHBASE.cmake b/cmake_modules/FindCOUCHBASE.cmake deleted file mode 100644 index f61d15c51c4..00000000000 --- a/cmake_modules/FindCOUCHBASE.cmake +++ /dev/null @@ -1,52 +0,0 @@ -################################################################################ -# HPCC SYSTEMS software Copyright (C) 2016 HPCC Systems®. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -################################################################################ - - -# - Try to find the Couchbase c library -# Once done this will define -# -# LIBCOUCHBASE_FOUND, if false, do not try to link with libev -# LIBCOUCHBASE_LIBRARIES, Library path and libs -# LIBCOUCHBASE_INCLUDE_DIR, where to find the libev headers - - -IF (NOT LIBCOUCHBASE_FOUND) - - #couchbase.h - #libcouchbase - - FIND_PATH ( - LIBCOUCHBASE_INCLUDE_DIR - NAMES couchbase.h - PATH_SUFFIXES libcouchbase - ) - - FIND_LIBRARY ( - LIBCOUCHBASE_LIBRARIES - NAMES couchbase libcouchbase - PATHS /usr/lib64 - PATH_SUFFIXES libcouchbase - ) - - include(FindPackageHandleStandardArgs) - find_package_handle_standard_args( - couchbase DEFAULT_MSG - LIBCOUCHBASE_LIBRARIES - LIBCOUCHBASE_INCLUDE_DIR - ) - - MARK_AS_ADVANCED(LIBCOUCHBASE_INCLUDE_DIR LIBCOUCHBASE_LIBRARIES) -ENDIF() diff --git a/cmake_modules/FindCPPUNIT.cmake b/cmake_modules/FindCPPUNIT.cmake deleted file mode 100644 index 3d2d5301a74..00000000000 --- a/cmake_modules/FindCPPUNIT.cmake +++ /dev/null @@ -1,74 +0,0 @@ -################################################################################ -# HPCC SYSTEMS software Copyright (C) 2012 HPCC Systems®. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -################################################################################ - - -# - Try to find the CppUnit unit testing library -# Once done this will define -# -# CPPUNIT_FOUND - system has the CppUnit library -# CPPUNIT_INCLUDE_DIR - the CppUnit include directory -# CPPUNIT_LIBRARIES - The libraries needed to use CppUnit - -IF (NOT CPPUNIT_FOUND) - IF (WIN32) - SET (cppunit_dll "cppunit_dll") - ELSE() - SET (cppunit_dll "cppunit") - ENDIF() - - IF (NOT "${EXTERNALS_DIRECTORY}" STREQUAL "") - - IF (UNIX) - IF (${ARCH64BIT} EQUAL 1) - SET (osdir "linux64_gcc4.1.1") - ELSE() - SET (osdir "linux32_gcc4.1.1") - ENDIF() - ELSEIF(WIN32) - IF (${ARCH64BIT} EQUAL 1) - SET (osdir "win64") - ELSE() - SET (osdir "win32") - ENDIF() - ELSE() - SET (osdir "unknown") - ENDIF() - - IF (NOT ("${osdir}" STREQUAL "unknown")) - FIND_PATH (CPPUNIT_INCLUDE_DIR NAMES cppunit/TestFixture.h PATHS "${EXTERNALS_DIRECTORY}/cppunit/include" NO_DEFAULT_PATH) - FIND_LIBRARY (CPPUNIT_LIBRARIES NAMES ${cppunit_dll} PATHS "${EXTERNALS_DIRECTORY}/cppunit/lib/${osdir}" NO_DEFAULT_PATH) - ENDIF() - - ENDIF() - - # if we didn't find in externals, look in system include path - if (USE_NATIVE_LIBRARIES) - FIND_PATH (CPPUNIT_INCLUDE_DIR NAMES cppunit/TestFixture.h) - FIND_LIBRARY (CPPUNIT_LIBRARIES NAMES ${cppunit_dll}) - endif() - - include(FindPackageHandleStandardArgs) - find_package_handle_standard_args(CppUnit DEFAULT_MSG - CPPUNIT_LIBRARIES - CPPUNIT_INCLUDE_DIR - ) - - IF (CPPUNIT_FOUND AND WIN32) - STRING(REPLACE "cppunit_dll" "cppunitd_dll" CPPUNIT_DEBUG_LIBRARIES "${CPPUNIT_LIBRARIES}") - set (CPPUNIT_LIBRARIES optimized ${CPPUNIT_LIBRARIES} debug ${CPPUNIT_DEBUG_LIBRARIES}) - ENDIF() - MARK_AS_ADVANCED(CPPUNIT_INCLUDE_DIR CPPUNIT_LIBRARIES) -ENDIF() diff --git a/cmake_modules/FindHIREDIS.cmake b/cmake_modules/FindHIREDIS.cmake deleted file mode 100644 index 114f3e0ea75..00000000000 --- a/cmake_modules/FindHIREDIS.cmake +++ /dev/null @@ -1,63 +0,0 @@ -################################################################################ -# HPCC SYSTEMS software Copyright (C) 2015 HPCC Systems®. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -################################################################################ - -# - Try to find the hiredis library -# Once done this will define -# -# HIREDIS_FOUND - system has the hiredis library -# HIREDIS_INCLUDE_DIR - the hiredis include directory(s) -# HIREDIS_LIBRARY - The library needed to use hiredis - -IF (NOT HIREDIS_FOUND) - IF (WIN32) - SET (libhiredis "libhiredis") - ELSE() - SET (libhiredis "hiredis") - ENDIF() - - FIND_PATH(HIREDIS_INCLUDE_DIR hiredis/hiredis.h PATHS /usr/include /usr/share/include /usr/local/include PATH_SUFFIXES hiredis) - FIND_LIBRARY(HIREDIS_LIBRARY NAMES ${libhiredis} PATHS /usr/lib /usr/share /usr/lib64 /usr/local/lib /usr/local/lib64) - - IF(EXISTS "${HIREDIS_INCLUDE_DIR}/hiredis/hiredis.h") - #MAJOR - FILE (STRINGS "${HIREDIS_INCLUDE_DIR}/hiredis/hiredis.h" major REGEX "#define HIREDIS_MAJOR") - STRING(REGEX REPLACE "#define HIREDIS_MAJOR " "" major "${major}") - STRING(REGEX REPLACE "\"" "" major "${major}") - #MINOR - FILE (STRINGS "${HIREDIS_INCLUDE_DIR}/hiredis/hiredis.h" minor REGEX "#define HIREDIS_MINOR") - STRING(REGEX REPLACE "#define HIREDIS_MINOR " "" minor "${minor}") - STRING(REGEX REPLACE "\"" "" minor "${minor}") - #PATCH - FILE (STRINGS "${HIREDIS_INCLUDE_DIR}/hiredis/hiredis.h" patch REGEX "#define HIREDIS_PATCH") - STRING(REGEX REPLACE "#define HIREDIS_PATCH " "" patch "${patch}") - STRING(REGEX REPLACE "\"" "" patch "${patch}") - - SET(HIREDIS_VERSION_STRING "${major}.${minor}.${patch}") - IF ("${HIREDIS_VERSION_STRING}" VERSION_LESS "${HIREDIS_FIND_VERSION}") - MESSAGE("WARNING - connection caching not avaliable with libhiredis version '${HIREDIS_VERSION_STRING}' as incompatible with min version>=${HIREDIS_FIND_VERSION}") - ENDIF() - ENDIF() - - - include(FindPackageHandleStandardArgs) - find_package_handle_standard_args(hiredis DEFAULT_MSG - HIREDIS_LIBRARY - HIREDIS_INCLUDE_DIR - ) - - MARK_AS_ADVANCED(HIREDIS_INCLUDE_DIR HIREDIS_LIBRARY) -ENDIF() - diff --git a/cmake_modules/FindMYSQL.cmake b/cmake_modules/FindMYSQL.cmake deleted file mode 100644 index db946772b7a..00000000000 --- a/cmake_modules/FindMYSQL.cmake +++ /dev/null @@ -1,38 +0,0 @@ -################################################################################ -# HPCC SYSTEMS software Copyright (C) 2012 HPCC Systems®. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -################################################################################ - - -# - Try to find the MYSQL library -# Once done this will define -# -# MYSQL_FOUND - system has the MYSQL library -# MYSQL_INCLUDE_DIR - the MYSQL include directory -# MYSQL_LIBRARIES - The libraries needed to use MYSQL - -IF (NOT MYSQL_FOUND) - FIND_PATH (MYSQL_INCLUDE_DIR NAMES mysql.h PATH_SUFFIXES mysql) - - SET (MYSQL_NAMES ${MYSQL_NAMES} mysqlclient libmysql) - FIND_LIBRARY (MYSQL_LIBRARIES NAMES ${MYSQL_NAMES}) - - include(FindPackageHandleStandardArgs) - find_package_handle_standard_args(MYSQL DEFAULT_MSG - MYSQL_LIBRARIES - MYSQL_INCLUDE_DIR - ) - - MARK_AS_ADVANCED(MYSQL_INCLUDE_DIR MYSQL_LIBRARIES) -ENDIF() diff --git a/cmake_modules/FindOPENLDAP.cmake b/cmake_modules/FindOPENLDAP.cmake deleted file mode 100644 index c67ee886a32..00000000000 --- a/cmake_modules/FindOPENLDAP.cmake +++ /dev/null @@ -1,72 +0,0 @@ -################################################################################ -# HPCC SYSTEMS software Copyright (C) 2012 HPCC Systems®. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -################################################################################ - - -# - Try to find the OpenLDAP libraries -# Once done this will define -# -# OPENLDAP_FOUND - system has the OpenLDAP library -# OPENLDAP_INCLUDE_DIR - the OpenLDAP include directory -# OPENLDAP_LIBRARIES - The libraries needed to use OpenLDAP -# -# Note that we use winldap for windows builds at present -# -IF (NOT OPENLDAP_FOUND) - IF (WIN32) - SET (ldap_dll "wldap32") - SET (lber_dll "netapi32") - SET (ldap_inc "Winldap.h") - ELSE() - SET (ldap_dll "ldap") - SET (lber_dll "lber") - SET (ldap_inc "ldap.h") - ENDIF() - - IF (NOT "${EXTERNALS_DIRECTORY}" STREQUAL "") - IF (UNIX) - IF (${ARCH64BIT} EQUAL 1) - SET (osincdir "openldap/linux64_gcc4.1.1/include") - SET (oslibdir "openldap/linux64_gcc4.1.1") - ELSE() - SET (osincdir "openldap/linux32_gcc4.1.1/include") - SET (oslibdir "openldap/linux32_gcc4.1.1") - ENDIF() - ELSEIF(WIN32) - SET (osincdir "winldap/include") - IF (${ARCH64BIT} EQUAL 1) - SET (oslibdir "winldap/lib64") - ELSE() - SET (oslibdir "winldap/lib32") - ENDIF() - ELSE() - SET (osincdir "unknown") - ENDIF() - IF (NOT ("${osincdir}" STREQUAL "unknown")) - FIND_PATH (OPENLDAP_INCLUDE_DIR NAMES ${ldap_inc} PATHS "${EXTERNALS_DIRECTORY}/${osincdir}" NO_DEFAULT_PATH) - FIND_LIBRARY (OPENLDAP_LIBRARIES NAMES ${ldap_dll} PATHS "${EXTERNALS_DIRECTORY}/${oslibdir}" NO_DEFAULT_PATH) - ENDIF() - ENDIF() - - # if we didn't find in externals, look in system include path - FIND_PATH (OPENLDAP_INCLUDE_DIR NAMES ${ldap_inc}) - FIND_LIBRARY (LDAP_LIBRARY ${ldap_dll}) - FIND_LIBRARY (LBER_LIBRARY ${lber_dll}) - - include(FindPackageHandleStandardArgs) - find_package_handle_standard_args(OPENLDAP DEFAULT_MSG OPENLDAP_INCLUDE_DIR LDAP_LIBRARY LBER_LIBRARY) - set(OPENLDAP_LIBRARIES ${LDAP_LIBRARY} ${LBER_LIBRARY}) - mark_as_advanced(OPENLDAP_INCLUDE_DIR OPENLDAP_LIBRARIES LDAP_LIBRARY LBER_LIBRARY) -ENDIF() diff --git a/cmake_modules/FindSQLITE3.cmake b/cmake_modules/FindSQLITE3.cmake deleted file mode 100644 index eb1bad4da65..00000000000 --- a/cmake_modules/FindSQLITE3.cmake +++ /dev/null @@ -1,41 +0,0 @@ -################################################################################ -# HPCC SYSTEMS software Copyright (C) 2014 HPCC Systems®. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -################################################################################ - -# - Try to find the Sqlite3 headers and libraries -# Once done this will define -# -# SQLITE3_FOUND - system has the SQLITE3 headers and library -# SQLITE3_INCLUDE_DIR - the SQLITE3 include directory -# SQLITE3_LIBRARIES - The libraries needed to use SQLITE3 - -IF (NOT SQLITE3_FOUND) - IF (WIN32) - SET (sqlite3_lib "libsqlite3") - ELSE() - SET (sqlite3_lib "sqlite3") - ENDIF() - - FIND_PATH (SQLITE3_INCLUDE_DIR NAMES sqlite3.h) - FIND_LIBRARY (SQLITE3_LIBRARIES NAMES ${sqlite3_lib}) - - include(FindPackageHandleStandardArgs) - find_package_handle_standard_args(SQLITE3 DEFAULT_MSG - SQLITE3_LIBRARIES - SQLITE3_INCLUDE_DIR - ) - - MARK_AS_ADVANCED(SQLITE3_INCLUDE_DIR SQLITE3_LIBRARIES) -ENDIF() diff --git a/cmake_modules/commonSetup.cmake b/cmake_modules/commonSetup.cmake index 660b68fefd9..34b2d3b4a63 100644 --- a/cmake_modules/commonSetup.cmake +++ b/cmake_modules/commonSetup.cmake @@ -721,27 +721,23 @@ IF ("${COMMONSETUP_DONE}" STREQUAL "") IF ( NOT MAKE_DOCS_ONLY ) IF (USE_OPENLDAP) - find_package(OPENLDAP) - IF (OPENLDAP_FOUND) - add_definitions (-D_USE_OPENLDAP) - ELSE() - message(FATAL_ERROR "OPENLDAP requested but package not found") - ENDIF() + find_package(PkgConfig) + pkg_check_modules(OPENLDAP REQUIRED IMPORTED_TARGET ldap) + add_definitions (-D_USE_OPENLDAP) ELSE() add_definitions (-D_NO_LDAP) ENDIF(USE_OPENLDAP) IF (USE_CPPUNIT) - find_package(CPPUNIT) - IF (CPPUNIT_FOUND) + find_package(CppUnit CONFIG REQUIRED) + IF (CppUnit_FOUND) add_definitions (-D_USE_CPPUNIT) - include_directories(${CPPUNIT_INCLUDE_DIR}) ELSE() message(FATAL_ERROR "CPPUNIT requested but package not found") ENDIF() ELSE() SET(CPPUNIT_INCLUDE_DIR "") - SET(CPPUNIT_LIBRARIES "") + SET(CppUnit_LIBRARIES "") ENDIF(USE_CPPUNIT) IF (CONTAINERIZED) diff --git a/common/remote/CMakeLists.txt b/common/remote/CMakeLists.txt index 9ef20874dbb..2758f5b02ca 100644 --- a/common/remote/CMakeLists.txt +++ b/common/remote/CMakeLists.txt @@ -71,7 +71,7 @@ target_link_libraries ( remote hql mp ${URIPARSER_LIBRARIES} - ${CPPUNIT_LIBRARIES} + ${CppUnit_LIBRARIES} ) IF (USE_OPENSSL) diff --git a/dali/datest/datest.cmake b/dali/datest/datest.cmake index 99e3a5e1ab4..60ae18153b6 100644 --- a/dali/datest/datest.cmake +++ b/dali/datest/datest.cmake @@ -51,7 +51,7 @@ target_link_libraries ( datest eclrtl wsdfuaccess dalibase - ${CPPUNIT_LIBRARIES} + ${CppUnit_LIBRARIES} ) diff --git a/dali/daunittest/CMakeLists.txt b/dali/daunittest/CMakeLists.txt index f540961be1c..d8d6fe5c718 100644 --- a/dali/daunittest/CMakeLists.txt +++ b/dali/daunittest/CMakeLists.txt @@ -49,7 +49,7 @@ target_link_libraries ( daunittest hrpc remote dalibase - ${CPPUNIT_LIBRARIES} + ${CppUnit_LIBRARIES} ) diff --git a/ecl/eclagent/CMakeLists.txt b/ecl/eclagent/CMakeLists.txt index 14a335b1d6a..b3dda9aaab7 100644 --- a/ecl/eclagent/CMakeLists.txt +++ b/ecl/eclagent/CMakeLists.txt @@ -48,7 +48,7 @@ install ( TARGETS hthor RUNTIME DESTINATION ${EXEC_DIR} ) target_link_libraries ( hthor hthorlib wuanalysis - ${CPPUNIT_LIBRARIES} + ${CppUnit_LIBRARIES} ) Install ( PROGRAMS ${CMAKE_CURRENT_SOURCE_DIR}/start_eclagent DESTINATION ${EXEC_DIR} COMPONENT Runtime ) diff --git a/ecl/hql/CMakeLists.txt b/ecl/hql/CMakeLists.txt index 32ea50dadaa..928067568b1 100644 --- a/ecl/hql/CMakeLists.txt +++ b/ecl/hql/CMakeLists.txt @@ -185,7 +185,7 @@ target_link_libraries ( hql nbcd eclrtl deftype - ${CPPUNIT_LIBRARIES} + ${CppUnit_LIBRARIES} ) IF (USE_ZLIB) diff --git a/esp/clients/wsdfuaccess/CMakeLists.txt b/esp/clients/wsdfuaccess/CMakeLists.txt index 844e8ac6897..f6ba409df4b 100644 --- a/esp/clients/wsdfuaccess/CMakeLists.txt +++ b/esp/clients/wsdfuaccess/CMakeLists.txt @@ -73,7 +73,7 @@ target_link_libraries ( wsdfuaccess dafsstream thorhelper dalibase - ${CPPUNIT_LIBRARIES} + ${CppUnit_LIBRARIES} ) if (NOT CONTAINERIZED) diff --git a/esp/services/ws_access/CMakeLists.txt b/esp/services/ws_access/CMakeLists.txt index 0024175be69..a0b4c1d3547 100644 --- a/esp/services/ws_access/CMakeLists.txt +++ b/esp/services/ws_access/CMakeLists.txt @@ -51,11 +51,6 @@ include_directories ( ${HPCC_SOURCE_DIR}/common/thorhelper ) -if(USE_OPENLDAP) - # NOTE - this should not be needed, it's the result of poor encapsulation and using CLdapSecManager directly - include_directories ( ${OPENLDAP_INCLUDE_DIR} ) -endif() - ADD_DEFINITIONS( -D_USRDLL -Dws_access_API_LOCAL -DESP_SERVICE_ws_access) HPCC_ADD_LIBRARY( ws_access SHARED ${SRCS} ) diff --git a/esp/services/ws_account/CMakeLists.txt b/esp/services/ws_account/CMakeLists.txt index 546b893a316..549c4a9de4e 100644 --- a/esp/services/ws_account/CMakeLists.txt +++ b/esp/services/ws_account/CMakeLists.txt @@ -49,11 +49,6 @@ include_directories ( ${HPCC_SOURCE_DIR}/common/thorhelper ) -if (USE_OPENLDAP) - # NOTE - this should not be needed, it's the result of poor encapsulation and using CLdapSecManager directly - include_directories ( ${OPENLDAP_INCLUDE_DIR} ) -endif () - ADD_DEFINITIONS( -D_USRDLL -Dws_account_API_LOCAL -DESP_SERVICE_ws_account) HPCC_ADD_LIBRARY( ws_account SHARED ${SRCS} ) diff --git a/esp/services/ws_cloud/CMakeLists.txt b/esp/services/ws_cloud/CMakeLists.txt index cbe496ae9a0..84f20635ac2 100644 --- a/esp/services/ws_cloud/CMakeLists.txt +++ b/esp/services/ws_cloud/CMakeLists.txt @@ -51,11 +51,6 @@ include_directories ( ${HPCC_SOURCE_DIR}/esp/smc/SMCLib ) -if (USE_OPENLDAP) - # NOTE - this should not be needed, it's the result of poor encapsulation and using CLdapSecManager directly - include_directories ( ${OPENLDAP_INCLUDE_DIR} ) -endif () - ADD_DEFINITIONS( -D_USRDLL -DWS_CLOUD_EXPORTS -DESP_SERVICE_WsCloud) HPCC_ADD_LIBRARY( ws_cloud SHARED ${SRCS} ) diff --git a/esp/services/ws_smc/CMakeLists.txt b/esp/services/ws_smc/CMakeLists.txt index 4614135ffd4..09d416fdcc3 100644 --- a/esp/services/ws_smc/CMakeLists.txt +++ b/esp/services/ws_smc/CMakeLists.txt @@ -65,11 +65,6 @@ include_directories ( ${HPCC_SOURCE_DIR}/esp/espcommon ) -if (USE_OPENLDAP) - # NOTE - this should not be needed, it's the result of poor encapsulation and using CLdapSecManager directly - include_directories ( ${OPENLDAP_INCLUDE_DIR} ) -endif () - ADD_DEFINITIONS( -D_USRDLL -DWS_SMC_EXPORTS -DWSSMC_API_LOCAL -DESP_SERVICE_WsSMC) HPCC_ADD_LIBRARY( ws_smc SHARED ${SRCS} ) diff --git a/esp/services/ws_workunits/CMakeLists.txt b/esp/services/ws_workunits/CMakeLists.txt index 9356d5d1a41..8358ed771ed 100644 --- a/esp/services/ws_workunits/CMakeLists.txt +++ b/esp/services/ws_workunits/CMakeLists.txt @@ -135,7 +135,7 @@ target_link_libraries ( ws_workunits pkgfiles wuanalysis ws_dfsclient - ${CPPUNIT_LIBRARIES} + ${CppUnit_LIBRARIES} ${COMMON_ESP_SERVICE_LIBS} ) diff --git a/fs/dafsserver/CMakeLists.txt b/fs/dafsserver/CMakeLists.txt index 7a144e10da9..3286906a4ea 100644 --- a/fs/dafsserver/CMakeLists.txt +++ b/fs/dafsserver/CMakeLists.txt @@ -64,7 +64,7 @@ target_link_libraries ( dafsserver dalibase thorhelper ftslavelib - ${CPPUNIT_LIBRARIES} + ${CppUnit_LIBRARIES} ) IF (USE_OPENSSL) diff --git a/plugins/mysql/CMakeLists.txt b/plugins/mysql/CMakeLists.txt index 313444d2a23..766cf2f2ec6 100644 --- a/plugins/mysql/CMakeLists.txt +++ b/plugins/mysql/CMakeLists.txt @@ -27,7 +27,7 @@ project(mysqlembed) if(MYSQLEMBED) ADD_PLUGIN(mysqlembed) if(MAKE_MYSQLEMBED) - find_package(MYSQL REQUIRED) + find_package(unofficial-libmysql REQUIRED) find_package(ZLIB REQUIRED) set( SRCS @@ -41,7 +41,7 @@ if(MYSQLEMBED) ./../../rtl/nbcd ./../../common/deftype ./../../system/jlib - ${MYSQL_INCLUDE_DIR}) + ) add_definitions(-D_USRDLL -DMYSQLEMBED_EXPORTS) @@ -58,10 +58,10 @@ if(MYSQLEMBED) CALC_DEPS) target_link_libraries( mysqlembed - ${MYSQL_LIBRARIES} eclrtl roxiemem jlib + unofficial::libmysql::libmysql ZLIB::ZLIB ) endif() diff --git a/plugins/mysql/mysqlembed.cpp b/plugins/mysql/mysqlembed.cpp index af829a92ad3..31cc34a5172 100644 --- a/plugins/mysql/mysqlembed.cpp +++ b/plugins/mysql/mysqlembed.cpp @@ -16,8 +16,8 @@ ############################################################################## */ #include "platform.h" -#include "mysql.h" -#include "mysqld_error.h" +#include +#include #include "jexcept.hpp" #include "jthread.hpp" #include "hqlplugins.hpp" diff --git a/roxie/roxiemem/CMakeLists.txt b/roxie/roxiemem/CMakeLists.txt index 1bc22b5c9ef..c0e020a43e2 100644 --- a/roxie/roxiemem/CMakeLists.txt +++ b/roxie/roxiemem/CMakeLists.txt @@ -57,7 +57,7 @@ endif() target_link_libraries ( roxiemem jlib - ${CPPUNIT_LIBRARIES} + ${CppUnit_LIBRARIES} ) diff --git a/rtl/nbcd/CMakeLists.txt b/rtl/nbcd/CMakeLists.txt index 83fd323061c..98cf0264457 100644 --- a/rtl/nbcd/CMakeLists.txt +++ b/rtl/nbcd/CMakeLists.txt @@ -46,7 +46,7 @@ if (NOT PLUGIN) endif() target_link_libraries ( nbcd jlib - ${CPPUNIT_LIBRARIES} + ${CppUnit_LIBRARIES} ) diff --git a/system/jhtree/CMakeLists.txt b/system/jhtree/CMakeLists.txt index dffe4b7caca..e7bc9e51727 100644 --- a/system/jhtree/CMakeLists.txt +++ b/system/jhtree/CMakeLists.txt @@ -68,7 +68,7 @@ target_link_libraries ( jhtree eclrtl zcrypt jlib - ${CPPUNIT_LIBRARIES} + ${CppUnit_LIBRARIES} ) diff --git a/system/security/LdapSecurity/CMakeLists.txt b/system/security/LdapSecurity/CMakeLists.txt index 30d9aaba0db..a766fbe6e92 100644 --- a/system/security/LdapSecurity/CMakeLists.txt +++ b/system/security/LdapSecurity/CMakeLists.txt @@ -47,7 +47,6 @@ include_directories ( ./../../../dali/base ./../../../system/mp ./../../../common/workunit - ${OPENLDAP_INCLUDE_DIR} ) ADD_DEFINITIONS( -DLDAPSECURITY_EXPORTS -D_USRDLL ) @@ -58,7 +57,7 @@ target_link_libraries ( LdapSecurity jlib dalibase workunit - ${OPENLDAP_LIBRARIES} + PkgConfig::OPENLDAP ) diff --git a/system/xmllib/CMakeLists.txt b/system/xmllib/CMakeLists.txt index a85a2842472..f8f8c286b92 100644 --- a/system/xmllib/CMakeLists.txt +++ b/system/xmllib/CMakeLists.txt @@ -73,5 +73,5 @@ target_link_libraries ( xmllib ) IF (USE_CPPUNIT) - target_link_libraries (xmllib ${CPPUNIT_LIBRARIES}) + target_link_libraries (xmllib ${CppUnit_LIBRARIES}) ENDIF() diff --git a/testing/unittests/CMakeLists.txt b/testing/unittests/CMakeLists.txt index 58153493d35..ea5e6c9f59e 100644 --- a/testing/unittests/CMakeLists.txt +++ b/testing/unittests/CMakeLists.txt @@ -110,7 +110,7 @@ target_link_libraries ( unittests esphttp esdllib logginglib - ${CPPUNIT_LIBRARIES} + ${CppUnit_LIBRARIES} ) if (NOT CONTAINERIZED) diff --git a/tools/wutool/CMakeLists.txt b/tools/wutool/CMakeLists.txt index 95cc20386bd..80cbec1dd57 100644 --- a/tools/wutool/CMakeLists.txt +++ b/tools/wutool/CMakeLists.txt @@ -64,7 +64,7 @@ target_link_libraries ( wutool deftype workunit wuanalysis - ${CPPUNIT_LIBRARIES} + ${CppUnit_LIBRARIES} ) if ( USE_CPPUNIT ) diff --git a/vcpkg_usage.txt b/vcpkg_usage.txt index a7888ec1e92..856a3a7fe6f 100644 --- a/vcpkg_usage.txt +++ b/vcpkg_usage.txt @@ -1,198 +1,228 @@ -[cmake] The package zlib is compatible with built-in CMake targets: -[cmake] -[cmake] find_package(ZLIB REQUIRED) -[cmake] target_link_libraries(main PRIVATE ZLIB::ZLIB) -[cmake] -[cmake] The package openssl is compatible with built-in CMake targets: -[cmake] -[cmake] find_package(OpenSSL REQUIRED) -[cmake] target_link_libraries(main PRIVATE OpenSSL::SSL OpenSSL::Crypto) -[cmake] -[cmake] curl provides CMake targets: -[cmake] -[cmake] # this is heuristically generated, and may not be correct -[cmake] find_package(CURL CONFIG REQUIRED) -[cmake] target_link_libraries(main PRIVATE CURL::libcurl) -[cmake] -[cmake] The package aws-sdk-cpp:x64-linux-dynamic provides CMake targets: -[cmake] -[cmake] When using AWSSDK, AWSSDK_ROOT_DIR must be defined by the user. -[cmake] find_package(AWSSDK CONFIG COMPONENTS core dynamodb kinesis s3 REQUIRED) -[cmake] target_include_directories(main PRIVATE ${AWSSDK_INCLUDE_DIRS}) -[cmake] target_link_libraries(main PRIVATE ${AWSSDK_LIBRARIES}) -[cmake] -[cmake] OR -[cmake] -[cmake] find_package(aws-cpp-sdk-core REQUIRED) -[cmake] target_include_directories(main PRIVATE aws-cpp-sdk-core) -[cmake] target_link_libraries(main PRIVATE aws-cpp-sdk-core) -[cmake] -[cmake] The package libxml2 is compatible with built-in CMake targets: -[cmake] -[cmake] find_package(LibXml2 REQUIRED) -[cmake] target_link_libraries(main PRIVATE LibXml2::LibXml2) -[cmake] -[cmake] azure-storage-blobs-cpp provides CMake targets: -[cmake] -[cmake] # this is heuristically generated, and may not be correct -[cmake] find_package(azure-storage-blobs-cpp CONFIG REQUIRED) -[cmake] target_link_libraries(main PRIVATE Azure::azure-storage-blobs) -[cmake] -[cmake] azure-storage-files-shares-cpp provides CMake targets: -[cmake] -[cmake] # this is heuristically generated, and may not be correct -[cmake] find_package(azure-storage-files-shares-cpp CONFIG REQUIRED) -[cmake] target_link_libraries(main PRIVATE Azure::azure-storage-files-shares) -[cmake] -[cmake] The package boost is compatible with built-in CMake targets: -[cmake] -[cmake] find_package(Boost REQUIRED [COMPONENTS ...]) -[cmake] target_link_libraries(main PRIVATE Boost::boost Boost:: Boost:: ...) -[cmake] -[cmake] libuv provides CMake targets: -[cmake] -[cmake] find_package(libuv CONFIG REQUIRED) -[cmake] target_link_libraries(main PRIVATE $,uv_a,uv>) -[cmake] -[cmake] cpr provides CMake targets: -[cmake] -[cmake] # this is heuristically generated, and may not be correct -[cmake] find_package(cpr CONFIG REQUIRED) -[cmake] target_link_libraries(main PRIVATE cpr::cpr) -[cmake] -[cmake] jsoncpp provides CMake targets: -[cmake] -[cmake] # this is heuristically generated, and may not be correct -[cmake] find_package(jsoncpp CONFIG REQUIRED) -[cmake] target_link_libraries(main PRIVATE jsoncpp_lib jsoncpp_object JsonCpp::JsonCpp) -[cmake] -[cmake] h3 provides CMake targets: -[cmake] -[cmake] # this is heuristically generated, and may not be correct -[cmake] find_package(h3 CONFIG REQUIRED) -[cmake] target_link_libraries(main PRIVATE h3::h3) -[cmake] -[cmake] hiredis provides CMake targets: -[cmake] -[cmake] # this is heuristically generated, and may not be correct -[cmake] find_package(hiredis CONFIG REQUIRED) -[cmake] target_link_libraries(main PRIVATE hiredis::hiredis) -[cmake] -[cmake] jwt-cpp is header-only and can be used from CMake via: -[cmake] -[cmake] find_path(JWT_CPP_INCLUDE_DIRS "jwt-cpp/base.h") -[cmake] target_include_directories(main PRIVATE ${JWT_CPP_INCLUDE_DIRS}) -[cmake] -[cmake] The package libarchive is compatible with the CMake Find Module: -[cmake] -[cmake] find_package(LibArchive REQUIRED) -[cmake] target_include_directories(main PRIVATE ${LibArchive_INCLUDE_DIRS}) -[cmake] target_link_libraries(main PRIVATE ${LibArchive_LIBRARIES}) -[cmake] -[cmake] find_package(LibArchive REQUIRED) -[cmake] target_link_libraries(main PRIVATE LibArchive::LibArchive) # CMake >= 3.17 -[cmake] -[cmake] libevent provides CMake targets: -[cmake] -[cmake] # this is heuristically generated, and may not be correct -[cmake] find_package(Libevent CONFIG REQUIRED) -[cmake] target_link_libraries(main PRIVATE libevent::core libevent::extra libevent::pthreads) -[cmake] -[cmake] libcouchbase-cxx is header-only and can be used from CMake via: -[cmake] -[cmake] find_path(LIBCOUCHBASE_CXX_INCLUDE_DIRS "libcouchbase/couchbase++.h") -[cmake] target_include_directories(main PRIVATE ${LIBCOUCHBASE_CXX_INCLUDE_DIRS}) -[cmake] -[cmake] libgit2 provides CMake targets: -[cmake] -[cmake] # this is heuristically generated, and may not be correct -[cmake] find_package(unofficial-git2 CONFIG REQUIRED) -[cmake] target_link_libraries(main PRIVATE unofficial::git2::git2) -[cmake] -[cmake] lz4 provides CMake targets: -[cmake] -[cmake] # this is heuristically generated, and may not be correct -[cmake] find_package(lz4 CONFIG REQUIRED) -[cmake] target_link_libraries(main PRIVATE lz4::lz4) -[cmake] -[cmake] The package libmysql provides CMake targets: -[cmake] -[cmake] find_package(libmysql REQUIRED) -[cmake] target_link_libraries(main PRIVATE ${MYSQL_LIBRARIES}) -[cmake] -[cmake] The package librdkafka:x64-linux-dynamic provides CMake targets: -[cmake] -[cmake] find_package(RdKafka CONFIG REQUIRED) -[cmake] target_link_libraries(main PRIVATE RdKafka::rdkafka RdKafka::rdkafka++) -[cmake] -[cmake] The package libxslt is compatible with built-in CMake targets: -[cmake] -[cmake] # xslt library -[cmake] find_package(LibXslt REQUIRED) -[cmake] target_link_libraries(main PRIVATE LibXslt::LibXslt) -[cmake] -[cmake] # exslt library -[cmake] find_package(LibXslt REQUIRED) -[cmake] target_link_libraries(main PRIVATE LibXslt::LibExslt) -[cmake] -[cmake] In order to use modules, you must set environment variable LIBXSLT_PLUGINS_PATH -[cmake] at runtime. -[cmake] -[cmake] libyaml provides CMake targets: -[cmake] -[cmake] # this is heuristically generated, and may not be correct -[cmake] find_package(yaml CONFIG REQUIRED) -[cmake] target_link_libraries(main PRIVATE yaml) -[cmake] -[cmake] mongo-cxx-driver provides CMake targets: -[cmake] -[cmake] # this is heuristically generated, and may not be correct -[cmake] find_package(bsoncxx CONFIG REQUIRED) -[cmake] target_link_libraries(main PRIVATE mongo::bsoncxx_shared) -[cmake] -[cmake] find_package(mongocxx CONFIG REQUIRED) -[cmake] target_link_libraries(main PRIVATE mongo::mongocxx_shared) -[cmake] -[cmake] The package nlohmann-json provides CMake targets: -[cmake] -[cmake] find_package(nlohmann_json CONFIG REQUIRED) -[cmake] target_link_libraries(main PRIVATE nlohmann_json::nlohmann_json) -[cmake] -[cmake] The package nlohmann-json can be configured to not provide implicit conversions via a custom triplet file: -[cmake] -[cmake] set(nlohmann-json_IMPLICIT_CONVERSIONS OFF) -[cmake] -[cmake] For more information, see the docs here: -[cmake] -[cmake] https://json.nlohmann.me/api/macros/json_use_implicit_conversions/ -[cmake] -[cmake] openblas provides CMake targets: -[cmake] -[cmake] # this is heuristically generated, and may not be correct -[cmake] find_package(OpenBLAS CONFIG REQUIRED) -[cmake] target_link_libraries(main PRIVATE OpenBLAS::OpenBLAS) -[cmake] -[cmake] The package openldapp can be imported via CMake FindPkgConfig module: -[cmake] -[cmake] find_package(PkgConfig) -[cmake] pkg_check_modules(OPENLDAP REQUIRED IMPORTED_TARGET ldap) -[cmake] -[cmake] target_link_libraries(main PRIVATE PkgConfig::OPENLDAP) -[cmake] -[cmake] rapidjson provides CMake targets: -[cmake] -[cmake] # this is heuristically generated, and may not be correct -[cmake] find_package(RapidJSON CONFIG REQUIRED) -[cmake] target_link_libraries(main PRIVATE rapidjson) -[cmake] -[cmake] sqlite3 provides CMake targets: -[cmake] -[cmake] # this is heuristically generated, and may not be correct -[cmake] find_package(unofficial-sqlite3 CONFIG REQUIRED) -[cmake] target_link_libraries(main PRIVATE unofficial::sqlite3::sqlite3) -[cmake] -[cmake] tbb provides CMake targets: -[cmake] -[cmake] # this is heuristically generated, and may not be correct -[cmake] find_package(TBB CONFIG REQUIRED) -[cmake] target_link_libraries(main PRIVATE TBB::tbb TBB::tbbmalloc TBB::tbbmalloc_proxy) \ No newline at end of file +rapidjson provides CMake targets: + + # this is heuristically generated, and may not be correct + find_package(RapidJSON CONFIG REQUIRED) + target_link_libraries(main PRIVATE rapidjson) + +The package zlib is compatible with built-in CMake targets: + + find_package(ZLIB REQUIRED) + target_link_libraries(main PRIVATE ZLIB::ZLIB) + +The package openssl is compatible with built-in CMake targets: + + find_package(OpenSSL REQUIRED) + target_link_libraries(main PRIVATE OpenSSL::SSL OpenSSL::Crypto) + +The package boost is compatible with built-in CMake targets: + + find_package(Boost REQUIRED [COMPONENTS ...]) + target_link_libraries(main PRIVATE Boost::boost Boost:: Boost:: ...) + +lz4 provides CMake targets: + + # this is heuristically generated, and may not be correct + find_package(lz4 CONFIG REQUIRED) + target_link_libraries(main PRIVATE lz4::lz4) + +The package arrow provides CMake targets: + + find_package(Arrow CONFIG REQUIRED) + target_link_libraries(main PRIVATE "$,Arrow::arrow_static,Arrow::arrow_shared>") + + find_package(Parquet CONFIG REQUIRED) + target_link_libraries(main PRIVATE "$,Parquet::parquet_static,Parquet::parquet_shared>") + + find_package(ArrowDataset CONFIG REQUIRED) + target_link_libraries(main PRIVATE "$,ArrowDataset::arrow_dataset_static,ArrowDataset::arrow_dataset_shared>") + + find_package(ArrowAcero CONFIG REQUIRED) + target_link_libraries(main PRIVATE "$,ArrowAcero::arrow_acero_static,ArrowAcero::arrow_acero_shared>") + +curl is compatible with built-in CMake targets: + + find_package(CURL REQUIRED) + target_link_libraries(main PRIVATE CURL::libcurl) + +The package aws-sdk-cpp:x64-linux-dynamic provides CMake targets: + + When using AWSSDK, AWSSDK_ROOT_DIR must be defined by the user. + find_package(AWSSDK CONFIG COMPONENTS core dynamodb kinesis s3 REQUIRED) + target_include_directories(main PRIVATE ${AWSSDK_INCLUDE_DIRS}) + target_link_libraries(main PRIVATE ${AWSSDK_LIBRARIES}) + + OR + + find_package(aws-cpp-sdk-core REQUIRED) + target_include_directories(main PRIVATE aws-cpp-sdk-core) + target_link_libraries(main PRIVATE aws-cpp-sdk-core) + +azure-storage-blobs-cpp provides CMake targets: + + # this is heuristically generated, and may not be correct + find_package(azure-storage-blobs-cpp CONFIG REQUIRED) + target_link_libraries(main PRIVATE Azure::azure-storage-blobs) + +azure-storage-files-shares-cpp provides CMake targets: + + # this is heuristically generated, and may not be correct + find_package(azure-storage-files-shares-cpp CONFIG REQUIRED) + target_link_libraries(main PRIVATE Azure::azure-storage-files-shares) + +libuv provides CMake targets: + + find_package(libuv CONFIG REQUIRED) + target_link_libraries(main PRIVATE $,libuv::uv_a,libuv::uv>) + +cppunit provides CMake targets: + + # this is heuristically generated, and may not be correct + find_package(CppUnit CONFIG REQUIRED) + target_link_libraries(main PRIVATE CppUnit) + +cpr provides CMake targets: + + # this is heuristically generated, and may not be correct + find_package(cpr CONFIG REQUIRED) + target_link_libraries(main PRIVATE cpr::cpr) + +jsoncpp provides CMake targets: + + # this is heuristically generated, and may not be correct + find_package(jsoncpp CONFIG REQUIRED) + target_link_libraries(main PRIVATE JsonCpp::JsonCpp) + +h3 provides CMake targets: + + # this is heuristically generated, and may not be correct + find_package(h3 CONFIG REQUIRED) + target_link_libraries(main PRIVATE h3::h3) + +hiredis provides CMake targets: + + # this is heuristically generated, and may not be correct + find_package(hiredis CONFIG REQUIRED) + target_link_libraries(main PRIVATE hiredis::hiredis) + +jwt-cpp is header-only and can be used from CMake via: + + find_path(JWT_CPP_INCLUDE_DIRS "jwt-cpp/base.h") + target_include_directories(main PRIVATE ${JWT_CPP_INCLUDE_DIRS}) + +The package libarchive is compatible with the CMake Find Module: + + find_package(LibArchive REQUIRED) + target_include_directories(main PRIVATE ${LibArchive_INCLUDE_DIRS}) + target_link_libraries(main PRIVATE ${LibArchive_LIBRARIES}) + + find_package(LibArchive REQUIRED) + target_link_libraries(main PRIVATE LibArchive::LibArchive) # CMake >= 3.17 + +libcouchbase-cxx is header-only and can be used from CMake via: + + find_path(LIBCOUCHBASE_CXX_INCLUDE_DIRS "libcouchbase/couchbase++.h") + target_include_directories(main PRIVATE ${LIBCOUCHBASE_CXX_INCLUDE_DIRS}) + +libgit2 can be imported via CMake FindPkgConfig module: + + find_package(PkgConfig REQUIRED) + pkg_check_modules(LIBGIT2 REQUIRED IMPORTED_TARGET libgit2) + target_link_libraries(main PRIVATE PkgConfig::LIBGIT2) + +vcpkg provides proprietary CMake targets: + + find_package(unofficial-libgit2 CONFIG REQUIRED) + target_link_libraries(main PRIVATE unofficial::libgit2::libgit2) + + +libmysql provides CMake targets: + + find_package(unofficial-libmysql REQUIRED) + target_link_libraries(main PRIVATE unofficial::libmysql::libmysql) + +The package librdkafka:x64-linux-dynamic provides CMake targets: + + find_package(RdKafka CONFIG REQUIRED) + target_link_libraries(main PRIVATE RdKafka::rdkafka RdKafka::rdkafka++) + +The package libxslt is compatible with built-in CMake targets: + + # xslt library + find_package(LibXslt REQUIRED) + target_link_libraries(main PRIVATE LibXslt::LibXslt) + + # exslt library + find_package(LibXslt REQUIRED) + target_link_libraries(main PRIVATE LibXslt::LibExslt) + +In order to use modules, you must set environment variable LIBXSLT_PLUGINS_PATH +at runtime. + +libyaml provides CMake targets: + + # this is heuristically generated, and may not be correct + find_package(yaml CONFIG REQUIRED) + target_link_libraries(main PRIVATE yaml) + +minizip provides CMake targets: + + find_package(unofficial-minizip CONFIG REQUIRED) + target_link_libraries(main PRIVATE unofficial::minizip::minizip) + +mongo-cxx-driver provides CMake targets: + + find_package(bsoncxx CONFIG REQUIRED) + target_link_libraries(main PRIVATE $,mongo::bsoncxx_static,mongo::bsoncxx_shared>) + + find_package(mongocxx CONFIG REQUIRED) + target_link_libraries(main PRIVATE $,mongo::mongocxx_static,mongo::mongocxx_shared>) + +The package nlohmann-json provides CMake targets: + + find_package(nlohmann_json CONFIG REQUIRED) + target_link_libraries(main PRIVATE nlohmann_json::nlohmann_json) + +The package nlohmann-json can be configured to not provide implicit conversions via a custom triplet file: + + set(nlohmann-json_IMPLICIT_CONVERSIONS OFF) + +For more information, see the docs here: + + https://json.nlohmann.me/api/macros/json_use_implicit_conversions/ + +nlp-engine provides CMake targets: + + # this is heuristically generated, and may not be correct + find_package(nlp-engine CONFIG REQUIRED) + target_link_libraries(main PRIVATE nlp-engine) + +openblas provides CMake targets: + + # this is heuristically generated, and may not be correct + find_package(OpenBLAS CONFIG REQUIRED) + target_link_libraries(main PRIVATE OpenBLAS::OpenBLAS) + +The package openldapp can be imported via CMake FindPkgConfig module: + + find_package(PkgConfig) + pkg_check_modules(OPENLDAP REQUIRED IMPORTED_TARGET ldap) + + target_link_libraries(main PRIVATE PkgConfig::OPENLDAP) + +opentelemetry-cpp provides CMake targets: + + # this is heuristically generated, and may not be correct + find_package(opentelemetry-cpp CONFIG REQUIRED) + # note: 21 additional targets are not displayed. + target_link_libraries(main PRIVATE opentelemetry-cpp::api opentelemetry-cpp::ext opentelemetry-cpp::sdk opentelemetry-cpp::logs) + +sqlite3 provides pkgconfig bindings. +sqlite3 provides CMake targets: + + find_package(unofficial-sqlite3 CONFIG REQUIRED) + target_link_libraries(main PRIVATE unofficial::sqlite3::sqlite3) + +wasmtime-cpp-api is header-only and can be used from CMake via: + + find_path(WASMTIME_CPP_API_INCLUDE_DIRS "wasmtime-cpp-api/wasmtime.hh") + target_include_directories(main PRIVATE ${WASMTIME_CPP_API_INCLUDE_DIRS}) \ No newline at end of file From 20fad48f6e1a924eb99297593e1169aeca7959f6 Mon Sep 17 00:00:00 2001 From: Jake Smith Date: Thu, 18 Apr 2024 16:54:44 +0100 Subject: [PATCH 07/44] Split off 9.0.102 Signed-off-by: Jake Smith --- helm/hpcc/Chart.yaml | 4 ++-- helm/hpcc/templates/_helpers.tpl | 2 +- helm/hpcc/templates/dafilesrv.yaml | 2 +- helm/hpcc/templates/dali.yaml | 2 +- helm/hpcc/templates/dfuserver.yaml | 2 +- helm/hpcc/templates/eclagent.yaml | 4 ++-- helm/hpcc/templates/eclccserver.yaml | 4 ++-- helm/hpcc/templates/eclscheduler.yaml | 2 +- helm/hpcc/templates/esp.yaml | 2 +- helm/hpcc/templates/localroxie.yaml | 2 +- helm/hpcc/templates/roxie.yaml | 8 ++++---- helm/hpcc/templates/sasha.yaml | 2 +- helm/hpcc/templates/thor.yaml | 10 +++++----- version.cmake | 4 ++-- 14 files changed, 25 insertions(+), 25 deletions(-) diff --git a/helm/hpcc/Chart.yaml b/helm/hpcc/Chart.yaml index d4ea3263062..926dee5d39e 100644 --- a/helm/hpcc/Chart.yaml +++ b/helm/hpcc/Chart.yaml @@ -6,9 +6,9 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. -version: 9.0.101-closedown0 +version: 9.0.103-closedown0 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. -appVersion: 9.0.101-closedown0 +appVersion: 9.0.103-closedown0 diff --git a/helm/hpcc/templates/_helpers.tpl b/helm/hpcc/templates/_helpers.tpl index 9cfd6a35e49..b0fe8548b6a 100644 --- a/helm/hpcc/templates/_helpers.tpl +++ b/helm/hpcc/templates/_helpers.tpl @@ -1314,7 +1314,7 @@ kind: Service metadata: name: {{ $lvars.serviceName | quote }} labels: - helmVersion: 9.0.101-closedown0 + helmVersion: 9.0.103-closedown0 {{- include "hpcc.addStandardLabels" (dict "root" $.root "instance" $lvars.serviceName ) | indent 4 }} {{- if $lvars.labels }} {{ toYaml $lvars.labels | indent 4 }} diff --git a/helm/hpcc/templates/dafilesrv.yaml b/helm/hpcc/templates/dafilesrv.yaml index 65e1d67ce25..018b16ce35a 100644 --- a/helm/hpcc/templates/dafilesrv.yaml +++ b/helm/hpcc/templates/dafilesrv.yaml @@ -50,7 +50,7 @@ spec: labels: {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "dafilesrv" "name" "dafilesrv" "instance" .name) | indent 8 }} server: {{ .name | quote }} - helmVersion: 9.0.101-closedown0 + helmVersion: 9.0.103-closedown0 annotations: checksum/config: {{ $configSHA }} spec: diff --git a/helm/hpcc/templates/dali.yaml b/helm/hpcc/templates/dali.yaml index b2214b42f9e..471e1fb64ce 100644 --- a/helm/hpcc/templates/dali.yaml +++ b/helm/hpcc/templates/dali.yaml @@ -82,7 +82,7 @@ spec: run: {{ $dali.name | quote }} server: {{ $dali.name | quote }} app: dali - helmVersion: 9.0.101-closedown0 + helmVersion: 9.0.103-closedown0 {{- if hasKey $.Values.global "metrics" }} {{- include "hpcc.generateMetricsReporterLabel" $.Values.global.metrics | nindent 8 }} {{- end }} diff --git a/helm/hpcc/templates/dfuserver.yaml b/helm/hpcc/templates/dfuserver.yaml index 1be81bf7807..ae31db7f340 100644 --- a/helm/hpcc/templates/dfuserver.yaml +++ b/helm/hpcc/templates/dfuserver.yaml @@ -56,7 +56,7 @@ spec: {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "dfuserver" "name" "dfuserver" "instance" .name) | indent 8 }} run: {{ .name | quote }} accessDali: "yes" - helmVersion: 9.0.101-closedown0 + helmVersion: 9.0.103-closedown0 {{- if hasKey . "labels" }} {{ toYaml .labels | indent 8 }} {{- end }} diff --git a/helm/hpcc/templates/eclagent.yaml b/helm/hpcc/templates/eclagent.yaml index c66e6beada4..53a7df364fc 100644 --- a/helm/hpcc/templates/eclagent.yaml +++ b/helm/hpcc/templates/eclagent.yaml @@ -58,7 +58,7 @@ data: {{- include "hpcc.addStandardLabels" (dict "root" $ "component" $apptype "name" "eclagent" "instance" $appJobName "instanceOf" (printf "%s-job" .me.name)) | indent 12 }} accessDali: "yes" accessEsp: "yes" - helmVersion: 9.0.101-closedown0 + helmVersion: 9.0.103-closedown0 {{- if hasKey .me "labels" }} {{ toYaml .me.labels | indent 12 }} {{- end }} @@ -135,7 +135,7 @@ spec: run: {{ .name | quote }} accessDali: "yes" accessEsp: {{ .useChildProcesses | default false | ternary "yes" "no" | quote }} - helmVersion: 9.0.101-closedown0 + helmVersion: 9.0.103-closedown0 {{- if hasKey . "labels" }} {{ toYaml .labels | indent 8 }} {{- end }} diff --git a/helm/hpcc/templates/eclccserver.yaml b/helm/hpcc/templates/eclccserver.yaml index fdc93f40b43..8d0d91a17f7 100644 --- a/helm/hpcc/templates/eclccserver.yaml +++ b/helm/hpcc/templates/eclccserver.yaml @@ -57,7 +57,7 @@ data: {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "eclccserver" "name" "eclccserver" "instance" $compileJobName "instanceOf" (printf "%s-job" .me.name)) | indent 12 }} accessDali: "yes" accessEsp: "yes" - helmVersion: 9.0.101-closedown0 + helmVersion: 9.0.103-closedown0 {{- if hasKey .me "labels" }} {{ toYaml .me.labels | indent 12 }} {{- end }} @@ -142,7 +142,7 @@ spec: run: {{ .name | quote }} accessDali: "yes" accessEsp: {{ .useChildProcesses | default false | ternary "yes" "no" | quote }} - helmVersion: 9.0.101-closedown0 + helmVersion: 9.0.103-closedown0 {{- if hasKey . "labels" }} {{ toYaml .labels | indent 8 }} {{- end }} diff --git a/helm/hpcc/templates/eclscheduler.yaml b/helm/hpcc/templates/eclscheduler.yaml index 8c6b6b823ed..57d975bd484 100644 --- a/helm/hpcc/templates/eclscheduler.yaml +++ b/helm/hpcc/templates/eclscheduler.yaml @@ -64,7 +64,7 @@ spec: run: {{ .name | quote }} accessDali: "yes" accessEsp: "no" - helmVersion: 9.0.101-closedown0 + helmVersion: 9.0.103-closedown0 {{- if hasKey . "labels" }} {{ toYaml .labels | indent 8 }} {{- end }} diff --git a/helm/hpcc/templates/esp.yaml b/helm/hpcc/templates/esp.yaml index 03a816d76d8..a9e076beece 100644 --- a/helm/hpcc/templates/esp.yaml +++ b/helm/hpcc/templates/esp.yaml @@ -117,7 +117,7 @@ spec: server: {{ .name | quote }} accessDali: "yes" app: {{ $application }} - helmVersion: 9.0.101-closedown0 + helmVersion: 9.0.103-closedown0 {{- include "hpcc.addStandardLabels" (dict "root" $ "name" $application "component" "esp" "instance" .name) | indent 8 }} {{- if hasKey $.Values.global "metrics" }} {{- include "hpcc.generateMetricsReporterLabel" $.Values.global.metrics | nindent 8 }} diff --git a/helm/hpcc/templates/localroxie.yaml b/helm/hpcc/templates/localroxie.yaml index 8602c42f2e2..7a334b4ab3e 100644 --- a/helm/hpcc/templates/localroxie.yaml +++ b/helm/hpcc/templates/localroxie.yaml @@ -70,7 +70,7 @@ spec: server: {{ $servername | quote }} accessDali: "yes" accessEsp: "yes" - helmVersion: 9.0.101-closedown0 + helmVersion: 9.0.103-closedown0 {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "roxie-server" "name" "roxie" "instance" $roxie.name) | indent 8 }} {{- if hasKey . "labels" }} {{ toYaml .labels | indent 8 }} diff --git a/helm/hpcc/templates/roxie.yaml b/helm/hpcc/templates/roxie.yaml index ad79b66cbf8..e12b0f76cc2 100644 --- a/helm/hpcc/templates/roxie.yaml +++ b/helm/hpcc/templates/roxie.yaml @@ -120,7 +120,7 @@ spec: {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "topology-server" "name" "roxie" "instance" $commonCtx.toponame) | indent 8 }} run: {{ $commonCtx.toponame | quote }} roxie-cluster: {{ $roxie.name | quote }} - helmVersion: 9.0.101-closedown0 + helmVersion: 9.0.103-closedown0 {{- if hasKey $.Values.global "metrics" }} {{- include "hpcc.generateMetricsReporterLabel" $.Values.global.metrics | nindent 8}} {{- end }} @@ -180,7 +180,7 @@ kind: Service metadata: name: {{ $commonCtx.toponame | quote }} labels: - helmVersion: 9.0.101-closedown0 + helmVersion: 9.0.103-closedown0 {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "topology-server" "name" "roxie" "instance" $commonCtx.toponame) | indent 4 }} spec: ports: @@ -242,7 +242,7 @@ spec: roxie-cluster: {{ $roxie.name | quote }} accessDali: "yes" accessEsp: "yes" - helmVersion: 9.0.101-closedown0 + helmVersion: 9.0.103-closedown0 {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "roxie-server" "name" "roxie" "instance" $servername) | indent 8 }} {{- if hasKey $.Values.global "metrics" }} {{- include "hpcc.generateMetricsReporterLabel" $.Values.global.metrics | nindent 8}} @@ -347,7 +347,7 @@ spec: roxie-cluster: {{ $roxie.name | quote }} accessDali: "yes" accessEsp: "yes" - helmVersion: 9.0.101-closedown0 + helmVersion: 9.0.103-closedown0 {{- if hasKey $.Values.global "metrics" }} {{- include "hpcc.generateMetricsReporterLabel" $.Values.global.metrics | nindent 8}} {{- end }} diff --git a/helm/hpcc/templates/sasha.yaml b/helm/hpcc/templates/sasha.yaml index b553607690d..101ba421389 100644 --- a/helm/hpcc/templates/sasha.yaml +++ b/helm/hpcc/templates/sasha.yaml @@ -52,7 +52,7 @@ spec: run: {{ $serviceName | quote }} server: {{ $serviceName | quote }} accessDali: {{ (has "dali" $sasha.access) | ternary "yes" "no" | quote }} - helmVersion: 9.0.101-closedown0 + helmVersion: 9.0.103-closedown0 {{- if hasKey $sasha "labels" }} {{ toYaml $sasha.labels | indent 8 }} {{- end }} diff --git a/helm/hpcc/templates/thor.yaml b/helm/hpcc/templates/thor.yaml index 59ae0021a3e..ca90bafc782 100644 --- a/helm/hpcc/templates/thor.yaml +++ b/helm/hpcc/templates/thor.yaml @@ -82,7 +82,7 @@ data: labels: accessDali: "yes" accessEsp: "yes" - helmVersion: 9.0.101-closedown0 + helmVersion: 9.0.103-closedown0 {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "eclagent" "name" "thor" "instance" $eclAgentJobName "instanceOf" (printf "%s-job" .eclAgentName)) | indent 8 }} {{- if hasKey .me "labels" }} {{ toYaml .me.labels | indent 12 }} @@ -147,7 +147,7 @@ data: accessEsp: "yes" app: "thor" component: "thormanager" - helmVersion: 9.0.101-closedown0 + helmVersion: 9.0.103-closedown0 instance: "_HPCC_JOBNAME_" job: "_HPCC_JOBNAME_" {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "thormanager" "name" "thor" "instance" $thorManagerJobName "instanceOf" (printf "%s-thormanager-job" .me.name)) | indent 12 }} @@ -214,7 +214,7 @@ data: accessEsp: "yes" app: "thor" component: "thorworker" - helmVersion: 9.0.101-closedown0 + helmVersion: 9.0.103-closedown0 instance: "_HPCC_JOBNAME_" job: "_HPCC_JOBNAME_" {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "thorworker" "name" "thor" "instance" $thorWorkerJobName "instanceOf" (printf "%s-thorworker-job" .me.name)) | indent 12 }} @@ -347,7 +347,7 @@ spec: accessEsp: {{ $commonCtx.eclAgentUseChildProcesses | ternary "yes" "no" | quote }} app: "thor" component: "thor-eclagent" - helmVersion: 9.0.101-closedown0 + helmVersion: 9.0.103-closedown0 instance: {{ $commonCtx.eclAgentName | quote }} {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "eclagent" "name" "thor" "instance" $commonCtx.eclAgentName ) | indent 8 }} {{- if hasKey $commonCtx.me "labels" }} @@ -412,7 +412,7 @@ spec: accessEsp: "no" app: "thor" component: "thor-thoragent" - helmVersion: 9.0.101-closedown0 + helmVersion: 9.0.103-closedown0 instance: {{ $commonCtx.thorAgentName | quote }} {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "eclagent" "name" "thor" "instance" $commonCtx.thorAgentName ) | indent 8 }} {{- if hasKey $commonCtx.me "labels" }} diff --git a/version.cmake b/version.cmake index 24e07fd3da4..72f14b08bbe 100644 --- a/version.cmake +++ b/version.cmake @@ -5,8 +5,8 @@ set ( HPCC_NAME "Community Edition" ) set ( HPCC_PROJECT "community" ) set ( HPCC_MAJOR 9 ) set ( HPCC_MINOR 0 ) -set ( HPCC_POINT 101 ) +set ( HPCC_POINT 103 ) set ( HPCC_MATURITY "closedown" ) set ( HPCC_SEQUENCE 0 ) -set ( HPCC_TAG_TIMESTAMP "2024-04-11T16:37:09Z" ) +set ( HPCC_TAG_TIMESTAMP "2024-04-18T15:54:44Z" ) ### From ca77b9efab3b6cc881d87e7d3dd411e064bd5539 Mon Sep 17 00:00:00 2001 From: Jake Smith Date: Thu, 18 Apr 2024 16:55:36 +0100 Subject: [PATCH 08/44] Split off 9.2.80 Signed-off-by: Jake Smith --- helm/hpcc/Chart.yaml | 4 ++-- helm/hpcc/templates/_helpers.tpl | 2 +- helm/hpcc/templates/dafilesrv.yaml | 2 +- helm/hpcc/templates/dali.yaml | 2 +- helm/hpcc/templates/dfuserver.yaml | 2 +- helm/hpcc/templates/eclagent.yaml | 4 ++-- helm/hpcc/templates/eclccserver.yaml | 4 ++-- helm/hpcc/templates/eclscheduler.yaml | 2 +- helm/hpcc/templates/esp.yaml | 2 +- helm/hpcc/templates/localroxie.yaml | 2 +- helm/hpcc/templates/roxie.yaml | 8 ++++---- helm/hpcc/templates/sasha.yaml | 2 +- helm/hpcc/templates/thor.yaml | 10 +++++----- version.cmake | 4 ++-- 14 files changed, 25 insertions(+), 25 deletions(-) diff --git a/helm/hpcc/Chart.yaml b/helm/hpcc/Chart.yaml index 4770b78709b..3d09b29334e 100644 --- a/helm/hpcc/Chart.yaml +++ b/helm/hpcc/Chart.yaml @@ -6,9 +6,9 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. -version: 9.2.79-closedown0 +version: 9.2.81-closedown0 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. -appVersion: 9.2.79-closedown0 +appVersion: 9.2.81-closedown0 diff --git a/helm/hpcc/templates/_helpers.tpl b/helm/hpcc/templates/_helpers.tpl index bbbfb6bfa43..79ec852c427 100644 --- a/helm/hpcc/templates/_helpers.tpl +++ b/helm/hpcc/templates/_helpers.tpl @@ -1405,7 +1405,7 @@ kind: Service metadata: name: {{ $lvars.serviceName | quote }} labels: - helmVersion: 9.2.79-closedown0 + helmVersion: 9.2.81-closedown0 {{- include "hpcc.addStandardLabels" (dict "root" $.root "instance" $lvars.serviceName ) | indent 4 }} {{- if $lvars.labels }} {{ toYaml $lvars.labels | indent 4 }} diff --git a/helm/hpcc/templates/dafilesrv.yaml b/helm/hpcc/templates/dafilesrv.yaml index 0a273e909ac..5004b29a224 100644 --- a/helm/hpcc/templates/dafilesrv.yaml +++ b/helm/hpcc/templates/dafilesrv.yaml @@ -50,7 +50,7 @@ spec: labels: {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "dafilesrv" "name" "dafilesrv" "instance" .name) | indent 8 }} server: {{ .name | quote }} - helmVersion: 9.2.79-closedown0 + helmVersion: 9.2.81-closedown0 annotations: checksum/config: {{ $configSHA }} {{- include "hpcc.generateAnnotations" $commonCtx | indent 8 }} diff --git a/helm/hpcc/templates/dali.yaml b/helm/hpcc/templates/dali.yaml index e4cf4ae13d4..589abe8e84b 100644 --- a/helm/hpcc/templates/dali.yaml +++ b/helm/hpcc/templates/dali.yaml @@ -82,7 +82,7 @@ spec: run: {{ $dali.name | quote }} server: {{ $dali.name | quote }} app: dali - helmVersion: 9.2.79-closedown0 + helmVersion: 9.2.81-closedown0 {{- if hasKey $.Values.global "metrics" }} {{- include "hpcc.generateMetricsReporterLabel" $.Values.global.metrics | nindent 8 }} {{- end }} diff --git a/helm/hpcc/templates/dfuserver.yaml b/helm/hpcc/templates/dfuserver.yaml index e017bc08f97..c266342fec5 100644 --- a/helm/hpcc/templates/dfuserver.yaml +++ b/helm/hpcc/templates/dfuserver.yaml @@ -56,7 +56,7 @@ spec: {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "dfuserver" "name" "dfuserver" "instance" .name) | indent 8 }} run: {{ .name | quote }} accessDali: "yes" - helmVersion: 9.2.79-closedown0 + helmVersion: 9.2.81-closedown0 {{- if hasKey . "labels" }} {{ toYaml .labels | indent 8 }} {{- end }} diff --git a/helm/hpcc/templates/eclagent.yaml b/helm/hpcc/templates/eclagent.yaml index b5905dcad91..c4deb3d7af1 100644 --- a/helm/hpcc/templates/eclagent.yaml +++ b/helm/hpcc/templates/eclagent.yaml @@ -58,7 +58,7 @@ data: {{- include "hpcc.addStandardLabels" (dict "root" $ "component" $apptype "name" "eclagent" "instance" $appJobName "instanceOf" (printf "%s-job" .me.name)) | indent 12 }} accessDali: "yes" accessEsp: "yes" - helmVersion: 9.2.79-closedown0 + helmVersion: 9.2.81-closedown0 {{- if hasKey .me "labels" }} {{ toYaml .me.labels | indent 12 }} {{- end }} @@ -133,7 +133,7 @@ spec: run: {{ .name | quote }} accessDali: "yes" accessEsp: {{ .useChildProcesses | default false | ternary "yes" "no" | quote }} - helmVersion: 9.2.79-closedown0 + helmVersion: 9.2.81-closedown0 {{- if hasKey . "labels" }} {{ toYaml .labels | indent 8 }} {{- end }} diff --git a/helm/hpcc/templates/eclccserver.yaml b/helm/hpcc/templates/eclccserver.yaml index fb6b96d9466..14c8b4e647c 100644 --- a/helm/hpcc/templates/eclccserver.yaml +++ b/helm/hpcc/templates/eclccserver.yaml @@ -57,7 +57,7 @@ data: {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "eclccserver" "name" "eclccserver" "instance" $compileJobName "instanceOf" (printf "%s-job" .me.name)) | indent 12 }} accessDali: "yes" accessEsp: "yes" - helmVersion: 9.2.79-closedown0 + helmVersion: 9.2.81-closedown0 {{- if hasKey .me "labels" }} {{ toYaml .me.labels | indent 12 }} {{- end }} @@ -140,7 +140,7 @@ spec: run: {{ .name | quote }} accessDali: "yes" accessEsp: {{ .useChildProcesses | default false | ternary "yes" "no" | quote }} - helmVersion: 9.2.79-closedown0 + helmVersion: 9.2.81-closedown0 {{- if hasKey . "labels" }} {{ toYaml .labels | indent 8 }} {{- end }} diff --git a/helm/hpcc/templates/eclscheduler.yaml b/helm/hpcc/templates/eclscheduler.yaml index 5a3de07a520..a4b3b7c7d04 100644 --- a/helm/hpcc/templates/eclscheduler.yaml +++ b/helm/hpcc/templates/eclscheduler.yaml @@ -64,7 +64,7 @@ spec: run: {{ .name | quote }} accessDali: "yes" accessEsp: "no" - helmVersion: 9.2.79-closedown0 + helmVersion: 9.2.81-closedown0 {{- if hasKey . "labels" }} {{ toYaml .labels | indent 8 }} {{- end }} diff --git a/helm/hpcc/templates/esp.yaml b/helm/hpcc/templates/esp.yaml index 37eb814310e..c5cfb8369b9 100644 --- a/helm/hpcc/templates/esp.yaml +++ b/helm/hpcc/templates/esp.yaml @@ -120,7 +120,7 @@ spec: accessSasha: "yes" {{- end }} app: {{ $application }} - helmVersion: 9.2.79-closedown0 + helmVersion: 9.2.81-closedown0 {{- include "hpcc.addStandardLabels" (dict "root" $ "name" $application "component" "esp" "instance" .name) | indent 8 }} {{- if hasKey $.Values.global "metrics" }} {{- include "hpcc.generateMetricsReporterLabel" $.Values.global.metrics | nindent 8 }} diff --git a/helm/hpcc/templates/localroxie.yaml b/helm/hpcc/templates/localroxie.yaml index 28879946f75..d1968e4f0a1 100644 --- a/helm/hpcc/templates/localroxie.yaml +++ b/helm/hpcc/templates/localroxie.yaml @@ -70,7 +70,7 @@ spec: server: {{ $servername | quote }} accessDali: "yes" accessEsp: "yes" - helmVersion: 9.2.79-closedown0 + helmVersion: 9.2.81-closedown0 {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "roxie-server" "name" "roxie" "instance" $roxie.name) | indent 8 }} {{- if hasKey . "labels" }} {{ toYaml .labels | indent 8 }} diff --git a/helm/hpcc/templates/roxie.yaml b/helm/hpcc/templates/roxie.yaml index fcecabd7c4e..b76c11fbb7f 100644 --- a/helm/hpcc/templates/roxie.yaml +++ b/helm/hpcc/templates/roxie.yaml @@ -120,7 +120,7 @@ spec: {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "topology-server" "name" "roxie" "instance" $commonCtx.toponame) | indent 8 }} run: {{ $commonCtx.toponame | quote }} roxie-cluster: {{ $roxie.name | quote }} - helmVersion: 9.2.79-closedown0 + helmVersion: 9.2.81-closedown0 {{- if hasKey $.Values.global "metrics" }} {{- include "hpcc.generateMetricsReporterLabel" $.Values.global.metrics | nindent 8}} {{- end }} @@ -178,7 +178,7 @@ kind: Service metadata: name: {{ $commonCtx.toponame | quote }} labels: - helmVersion: 9.2.79-closedown0 + helmVersion: 9.2.81-closedown0 {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "topology-server" "name" "roxie" "instance" $commonCtx.toponame) | indent 4 }} spec: ports: @@ -240,7 +240,7 @@ spec: roxie-cluster: {{ $roxie.name | quote }} accessDali: "yes" accessEsp: "yes" - helmVersion: 9.2.79-closedown0 + helmVersion: 9.2.81-closedown0 {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "roxie-server" "name" "roxie" "instance" $servername) | indent 8 }} {{- if hasKey $.Values.global "metrics" }} {{- include "hpcc.generateMetricsReporterLabel" $.Values.global.metrics | nindent 8}} @@ -346,7 +346,7 @@ spec: roxie-cluster: {{ $roxie.name | quote }} accessDali: "yes" accessEsp: "yes" - helmVersion: 9.2.79-closedown0 + helmVersion: 9.2.81-closedown0 {{- if hasKey $.Values.global "metrics" }} {{- include "hpcc.generateMetricsReporterLabel" $.Values.global.metrics | nindent 8}} {{- end }} diff --git a/helm/hpcc/templates/sasha.yaml b/helm/hpcc/templates/sasha.yaml index 082e8f6de27..1a425ab70a5 100644 --- a/helm/hpcc/templates/sasha.yaml +++ b/helm/hpcc/templates/sasha.yaml @@ -53,7 +53,7 @@ spec: server: {{ $serviceName | quote }} app: sasha accessDali: {{ (has "dali" $sasha.access) | ternary "yes" "no" | quote }} - helmVersion: 9.2.79-closedown0 + helmVersion: 9.2.81-closedown0 {{- if hasKey $sasha "labels" }} {{ toYaml $sasha.labels | indent 8 }} {{- end }} diff --git a/helm/hpcc/templates/thor.yaml b/helm/hpcc/templates/thor.yaml index 03d2f5f0ba5..6e8c89e7d8a 100644 --- a/helm/hpcc/templates/thor.yaml +++ b/helm/hpcc/templates/thor.yaml @@ -82,7 +82,7 @@ data: labels: accessDali: "yes" accessEsp: "yes" - helmVersion: 9.2.79-closedown0 + helmVersion: 9.2.81-closedown0 {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "eclagent" "name" "thor" "instance" $eclAgentJobName "instanceOf" (printf "%s-job" .eclAgentName)) | indent 8 }} {{- if hasKey .me "labels" }} {{ toYaml .me.labels | indent 12 }} @@ -145,7 +145,7 @@ data: accessEsp: "yes" app: "thor" component: "thormanager" - helmVersion: 9.2.79-closedown0 + helmVersion: 9.2.81-closedown0 instance: "_HPCC_JOBNAME_" job: "_HPCC_JOBNAME_" {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "thormanager" "name" "thor" "instance" $thorManagerJobName "instanceOf" (printf "%s-thormanager-job" .me.name)) | indent 12 }} @@ -210,7 +210,7 @@ data: accessEsp: "yes" app: "thor" component: "thorworker" - helmVersion: 9.2.79-closedown0 + helmVersion: 9.2.81-closedown0 instance: "_HPCC_JOBNAME_" job: "_HPCC_JOBNAME_" {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "thorworker" "name" "thor" "instance" $thorWorkerJobName "instanceOf" (printf "%s-thorworker-job" .me.name)) | indent 12 }} @@ -341,7 +341,7 @@ spec: accessEsp: {{ $commonCtx.eclAgentUseChildProcesses | ternary "yes" "no" | quote }} app: "thor" component: "thor-eclagent" - helmVersion: 9.2.79-closedown0 + helmVersion: 9.2.81-closedown0 instance: {{ $commonCtx.eclAgentName | quote }} {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "eclagent" "name" "thor" "instance" $commonCtx.eclAgentName ) | indent 8 }} {{- if hasKey $commonCtx.me "labels" }} @@ -404,7 +404,7 @@ spec: accessEsp: "no" app: "thor" component: "thor-thoragent" - helmVersion: 9.2.79-closedown0 + helmVersion: 9.2.81-closedown0 instance: {{ $commonCtx.thorAgentName | quote }} {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "eclagent" "name" "thor" "instance" $commonCtx.thorAgentName ) | indent 8 }} {{- if hasKey $commonCtx.me "labels" }} diff --git a/version.cmake b/version.cmake index 3aad73083f9..e16620e573f 100644 --- a/version.cmake +++ b/version.cmake @@ -5,8 +5,8 @@ set ( HPCC_NAME "Community Edition" ) set ( HPCC_PROJECT "community" ) set ( HPCC_MAJOR 9 ) set ( HPCC_MINOR 2 ) -set ( HPCC_POINT 79 ) +set ( HPCC_POINT 81 ) set ( HPCC_MATURITY "closedown" ) set ( HPCC_SEQUENCE 0 ) -set ( HPCC_TAG_TIMESTAMP "2024-04-11T16:30:30Z" ) +set ( HPCC_TAG_TIMESTAMP "2024-04-18T15:55:36Z" ) ### From 172a1793448b74e0032ca3d9c204fa5f8ab3708b Mon Sep 17 00:00:00 2001 From: Jake Smith Date: Thu, 18 Apr 2024 16:56:24 +0100 Subject: [PATCH 09/44] Split off 9.4.54 Signed-off-by: Jake Smith --- helm/hpcc/Chart.yaml | 4 ++-- helm/hpcc/templates/_helpers.tpl | 2 +- helm/hpcc/templates/dafilesrv.yaml | 2 +- helm/hpcc/templates/dali.yaml | 2 +- helm/hpcc/templates/dfuserver.yaml | 2 +- helm/hpcc/templates/eclagent.yaml | 4 ++-- helm/hpcc/templates/eclccserver.yaml | 4 ++-- helm/hpcc/templates/eclscheduler.yaml | 2 +- helm/hpcc/templates/esp.yaml | 2 +- helm/hpcc/templates/localroxie.yaml | 2 +- helm/hpcc/templates/roxie.yaml | 8 ++++---- helm/hpcc/templates/sasha.yaml | 2 +- helm/hpcc/templates/thor.yaml | 10 +++++----- version.cmake | 4 ++-- 14 files changed, 25 insertions(+), 25 deletions(-) diff --git a/helm/hpcc/Chart.yaml b/helm/hpcc/Chart.yaml index db456fcccc9..f702294b31e 100644 --- a/helm/hpcc/Chart.yaml +++ b/helm/hpcc/Chart.yaml @@ -6,9 +6,9 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. -version: 9.4.53-closedown0 +version: 9.4.55-closedown0 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. -appVersion: 9.4.53-closedown0 +appVersion: 9.4.55-closedown0 diff --git a/helm/hpcc/templates/_helpers.tpl b/helm/hpcc/templates/_helpers.tpl index 13b76cb0247..08a7ea8647c 100644 --- a/helm/hpcc/templates/_helpers.tpl +++ b/helm/hpcc/templates/_helpers.tpl @@ -1505,7 +1505,7 @@ kind: Service metadata: name: {{ $lvars.serviceName | quote }} labels: - helmVersion: 9.4.53-closedown0 + helmVersion: 9.4.55-closedown0 {{- include "hpcc.addStandardLabels" (dict "root" $.root "instance" $lvars.serviceName ) | indent 4 }} {{- if $lvars.labels }} {{ toYaml $lvars.labels | indent 4 }} diff --git a/helm/hpcc/templates/dafilesrv.yaml b/helm/hpcc/templates/dafilesrv.yaml index 35772e9bb1b..93fc12aac7c 100644 --- a/helm/hpcc/templates/dafilesrv.yaml +++ b/helm/hpcc/templates/dafilesrv.yaml @@ -51,7 +51,7 @@ spec: labels: {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "dafilesrv" "name" "dafilesrv" "instance" .name) | indent 8 }} server: {{ .name | quote }} - helmVersion: 9.4.53-closedown0 + helmVersion: 9.4.55-closedown0 annotations: checksum/config: {{ $configSHA }} {{- include "hpcc.generateAnnotations" $commonCtx | indent 8 }} diff --git a/helm/hpcc/templates/dali.yaml b/helm/hpcc/templates/dali.yaml index fdb3a54081f..e73295a86c2 100644 --- a/helm/hpcc/templates/dali.yaml +++ b/helm/hpcc/templates/dali.yaml @@ -84,7 +84,7 @@ spec: run: {{ $dali.name | quote }} server: {{ $dali.name | quote }} app: dali - helmVersion: 9.4.53-closedown0 + helmVersion: 9.4.55-closedown0 {{- if hasKey $.Values.global "metrics" }} {{- include "hpcc.generateMetricsReporterLabel" $.Values.global.metrics | nindent 8 }} {{- end }} diff --git a/helm/hpcc/templates/dfuserver.yaml b/helm/hpcc/templates/dfuserver.yaml index 24760715bef..733bd9a8309 100644 --- a/helm/hpcc/templates/dfuserver.yaml +++ b/helm/hpcc/templates/dfuserver.yaml @@ -57,7 +57,7 @@ spec: {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "dfuserver" "name" "dfuserver" "instance" .name) | indent 8 }} run: {{ .name | quote }} accessDali: "yes" - helmVersion: 9.4.53-closedown0 + helmVersion: 9.4.55-closedown0 {{- if hasKey . "labels" }} {{ toYaml .labels | indent 8 }} {{- end }} diff --git a/helm/hpcc/templates/eclagent.yaml b/helm/hpcc/templates/eclagent.yaml index 2334d0c40dd..3648f8836af 100644 --- a/helm/hpcc/templates/eclagent.yaml +++ b/helm/hpcc/templates/eclagent.yaml @@ -60,7 +60,7 @@ data: {{- include "hpcc.addStandardLabels" (dict "root" $ "component" $apptype "name" "eclagent" "instance" $appJobName "instanceOf" (printf "%s-job" .me.name)) | indent 12 }} accessDali: "yes" accessEsp: "yes" - helmVersion: 9.4.53-closedown0 + helmVersion: 9.4.55-closedown0 {{- if hasKey .me "labels" }} {{ toYaml .me.labels | indent 12 }} {{- end }} @@ -140,7 +140,7 @@ spec: run: {{ .name | quote }} accessDali: "yes" accessEsp: {{ .useChildProcesses | default false | ternary "yes" "no" | quote }} - helmVersion: 9.4.53-closedown0 + helmVersion: 9.4.55-closedown0 {{- if hasKey . "labels" }} {{ toYaml .labels | indent 8 }} {{- end }} diff --git a/helm/hpcc/templates/eclccserver.yaml b/helm/hpcc/templates/eclccserver.yaml index 02bef74e44a..15060d85cb1 100644 --- a/helm/hpcc/templates/eclccserver.yaml +++ b/helm/hpcc/templates/eclccserver.yaml @@ -58,7 +58,7 @@ data: {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "eclccserver" "name" "eclccserver" "instance" $compileJobName "instanceOf" (printf "%s-job" .me.name)) | indent 12 }} accessDali: "yes" accessEsp: "yes" - helmVersion: 9.4.53-closedown0 + helmVersion: 9.4.55-closedown0 {{- if hasKey .me "labels" }} {{ toYaml .me.labels | indent 12 }} {{- end }} @@ -146,7 +146,7 @@ spec: run: {{ .name | quote }} accessDali: "yes" accessEsp: {{ .useChildProcesses | default false | ternary "yes" "no" | quote }} - helmVersion: 9.4.53-closedown0 + helmVersion: 9.4.55-closedown0 {{- if hasKey . "labels" }} {{ toYaml .labels | indent 8 }} {{- end }} diff --git a/helm/hpcc/templates/eclscheduler.yaml b/helm/hpcc/templates/eclscheduler.yaml index f0435c60153..b535921c65a 100644 --- a/helm/hpcc/templates/eclscheduler.yaml +++ b/helm/hpcc/templates/eclscheduler.yaml @@ -65,7 +65,7 @@ spec: run: {{ .name | quote }} accessDali: "yes" accessEsp: "no" - helmVersion: 9.4.53-closedown0 + helmVersion: 9.4.55-closedown0 {{- if hasKey . "labels" }} {{ toYaml .labels | indent 8 }} {{- end }} diff --git a/helm/hpcc/templates/esp.yaml b/helm/hpcc/templates/esp.yaml index 39052418659..0583cdb8f1e 100644 --- a/helm/hpcc/templates/esp.yaml +++ b/helm/hpcc/templates/esp.yaml @@ -122,7 +122,7 @@ spec: accessSasha: "yes" {{- end }} app: {{ $application }} - helmVersion: 9.4.53-closedown0 + helmVersion: 9.4.55-closedown0 {{- include "hpcc.addStandardLabels" (dict "root" $ "name" $application "component" "esp" "instance" .name) | indent 8 }} {{- if hasKey $.Values.global "metrics" }} {{- include "hpcc.generateMetricsReporterLabel" $.Values.global.metrics | nindent 8 }} diff --git a/helm/hpcc/templates/localroxie.yaml b/helm/hpcc/templates/localroxie.yaml index e2252797296..6701077779d 100644 --- a/helm/hpcc/templates/localroxie.yaml +++ b/helm/hpcc/templates/localroxie.yaml @@ -73,7 +73,7 @@ spec: server: {{ $servername | quote }} accessDali: "yes" accessEsp: "yes" - helmVersion: 9.4.53-closedown0 + helmVersion: 9.4.55-closedown0 {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "roxie-server" "name" "roxie" "instance" $roxie.name) | indent 8 }} {{- if hasKey . "labels" }} {{ toYaml .labels | indent 8 }} diff --git a/helm/hpcc/templates/roxie.yaml b/helm/hpcc/templates/roxie.yaml index 0dac18565f2..969574f48a9 100644 --- a/helm/hpcc/templates/roxie.yaml +++ b/helm/hpcc/templates/roxie.yaml @@ -125,7 +125,7 @@ spec: {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "topology-server" "name" "roxie" "instance" $commonCtx.toponame) | indent 8 }} run: {{ $commonCtx.toponame | quote }} roxie-cluster: {{ $roxie.name | quote }} - helmVersion: 9.4.53-closedown0 + helmVersion: 9.4.55-closedown0 {{- if hasKey $.Values.global "metrics" }} {{- include "hpcc.generateMetricsReporterLabel" $.Values.global.metrics | nindent 8}} {{- end }} @@ -184,7 +184,7 @@ kind: Service metadata: name: {{ $commonCtx.toponame | quote }} labels: - helmVersion: 9.4.53-closedown0 + helmVersion: 9.4.55-closedown0 {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "topology-server" "name" "roxie" "instance" $commonCtx.toponame) | indent 4 }} spec: ports: @@ -246,7 +246,7 @@ spec: roxie-cluster: {{ $roxie.name | quote }} accessDali: "yes" accessEsp: "yes" - helmVersion: 9.4.53-closedown0 + helmVersion: 9.4.55-closedown0 {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "roxie-server" "name" "roxie" "instance" $servername) | indent 8 }} {{- if hasKey $.Values.global "metrics" }} {{- include "hpcc.generateMetricsReporterLabel" $.Values.global.metrics | nindent 8}} @@ -357,7 +357,7 @@ spec: roxie-cluster: {{ $roxie.name | quote }} accessDali: "yes" accessEsp: "yes" - helmVersion: 9.4.53-closedown0 + helmVersion: 9.4.55-closedown0 {{- if hasKey $.Values.global "metrics" }} {{- include "hpcc.generateMetricsReporterLabel" $.Values.global.metrics | nindent 8}} {{- end }} diff --git a/helm/hpcc/templates/sasha.yaml b/helm/hpcc/templates/sasha.yaml index 37807781569..ded5d91fcfb 100644 --- a/helm/hpcc/templates/sasha.yaml +++ b/helm/hpcc/templates/sasha.yaml @@ -53,7 +53,7 @@ spec: server: {{ $serviceName | quote }} app: sasha accessDali: {{ (has "dali" $sasha.access) | ternary "yes" "no" | quote }} - helmVersion: 9.4.53-closedown0 + helmVersion: 9.4.55-closedown0 {{- if hasKey $sasha "labels" }} {{ toYaml $sasha.labels | indent 8 }} {{- end }} diff --git a/helm/hpcc/templates/thor.yaml b/helm/hpcc/templates/thor.yaml index dea866c0440..5d8a220401e 100644 --- a/helm/hpcc/templates/thor.yaml +++ b/helm/hpcc/templates/thor.yaml @@ -86,7 +86,7 @@ data: labels: accessDali: "yes" accessEsp: "yes" - helmVersion: 9.4.53-closedown0 + helmVersion: 9.4.55-closedown0 {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "eclagent" "name" "thor" "instance" $eclAgentJobName "instanceOf" (printf "%s-job" .eclAgentName)) | indent 8 }} {{- if hasKey .me "labels" }} {{ toYaml .me.labels | indent 12 }} @@ -154,7 +154,7 @@ data: accessEsp: "yes" app: "thor" component: "thormanager" - helmVersion: 9.4.53-closedown0 + helmVersion: 9.4.55-closedown0 instance: "_HPCC_JOBNAME_" job: "_HPCC_JOBNAME_" {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "thormanager" "name" "thor" "instance" $thorManagerJobName "instanceOf" (printf "%s-thormanager-job" .me.name)) | indent 12 }} @@ -224,7 +224,7 @@ data: accessEsp: "yes" app: "thor" component: "thorworker" - helmVersion: 9.4.53-closedown0 + helmVersion: 9.4.55-closedown0 instance: "_HPCC_JOBNAME_" job: "_HPCC_JOBNAME_" {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "thorworker" "name" "thor" "instance" $thorWorkerJobName "instanceOf" (printf "%s-thorworker-job" .me.name)) | indent 12 }} @@ -360,7 +360,7 @@ spec: accessEsp: {{ $commonCtx.eclAgentUseChildProcesses | ternary "yes" "no" | quote }} app: "thor" component: "thor-eclagent" - helmVersion: 9.4.53-closedown0 + helmVersion: 9.4.55-closedown0 instance: {{ $commonCtx.eclAgentName | quote }} {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "eclagent" "name" "thor" "instance" $commonCtx.eclAgentName ) | indent 8 }} {{- if hasKey $commonCtx.me "labels" }} @@ -428,7 +428,7 @@ spec: accessEsp: "no" app: "thor" component: "thor-thoragent" - helmVersion: 9.4.53-closedown0 + helmVersion: 9.4.55-closedown0 instance: {{ $commonCtx.thorAgentName | quote }} {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "eclagent" "name" "thor" "instance" $commonCtx.thorAgentName ) | indent 8 }} {{- if hasKey $commonCtx.me "labels" }} diff --git a/version.cmake b/version.cmake index 10dd160492d..bfae8490374 100644 --- a/version.cmake +++ b/version.cmake @@ -5,8 +5,8 @@ set ( HPCC_NAME "Community Edition" ) set ( HPCC_PROJECT "community" ) set ( HPCC_MAJOR 9 ) set ( HPCC_MINOR 4 ) -set ( HPCC_POINT 53 ) +set ( HPCC_POINT 55 ) set ( HPCC_MATURITY "closedown" ) set ( HPCC_SEQUENCE 0 ) -set ( HPCC_TAG_TIMESTAMP "2024-04-11T16:35:41Z" ) +set ( HPCC_TAG_TIMESTAMP "2024-04-18T15:56:24Z" ) ### From 2ca3375e0095fbb1769681410e09e352322efef2 Mon Sep 17 00:00:00 2001 From: Jake Smith Date: Thu, 18 Apr 2024 16:57:23 +0100 Subject: [PATCH 10/44] Split off 9.6.6 Signed-off-by: Jake Smith --- helm/hpcc/Chart.yaml | 4 ++-- helm/hpcc/templates/_helpers.tpl | 2 +- helm/hpcc/templates/dafilesrv.yaml | 2 +- helm/hpcc/templates/dali.yaml | 2 +- helm/hpcc/templates/dfuserver.yaml | 2 +- helm/hpcc/templates/eclagent.yaml | 4 ++-- helm/hpcc/templates/eclccserver.yaml | 4 ++-- helm/hpcc/templates/eclscheduler.yaml | 2 +- helm/hpcc/templates/esp.yaml | 2 +- helm/hpcc/templates/localroxie.yaml | 2 +- helm/hpcc/templates/roxie.yaml | 8 ++++---- helm/hpcc/templates/sasha.yaml | 2 +- helm/hpcc/templates/thor.yaml | 10 +++++----- version.cmake | 4 ++-- 14 files changed, 25 insertions(+), 25 deletions(-) diff --git a/helm/hpcc/Chart.yaml b/helm/hpcc/Chart.yaml index 32376193b5c..40de4755300 100644 --- a/helm/hpcc/Chart.yaml +++ b/helm/hpcc/Chart.yaml @@ -6,9 +6,9 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. -version: 9.6.5-closedown0 +version: 9.6.7-closedown0 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. -appVersion: 9.6.5-closedown0 +appVersion: 9.6.7-closedown0 diff --git a/helm/hpcc/templates/_helpers.tpl b/helm/hpcc/templates/_helpers.tpl index ddb8e581ddf..19fd450f10f 100644 --- a/helm/hpcc/templates/_helpers.tpl +++ b/helm/hpcc/templates/_helpers.tpl @@ -1509,7 +1509,7 @@ kind: Service metadata: name: {{ $lvars.serviceName | quote }} labels: - helmVersion: 9.6.5-closedown0 + helmVersion: 9.6.7-closedown0 {{- include "hpcc.addStandardLabels" (dict "root" $.root "instance" $lvars.serviceName ) | indent 4 }} {{- if $lvars.labels }} {{ toYaml $lvars.labels | indent 4 }} diff --git a/helm/hpcc/templates/dafilesrv.yaml b/helm/hpcc/templates/dafilesrv.yaml index 2ebb4e2608c..d8b8c288270 100644 --- a/helm/hpcc/templates/dafilesrv.yaml +++ b/helm/hpcc/templates/dafilesrv.yaml @@ -51,7 +51,7 @@ spec: labels: {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "dafilesrv" "name" "dafilesrv" "instance" .name) | indent 8 }} server: {{ .name | quote }} - helmVersion: 9.6.5-closedown0 + helmVersion: 9.6.7-closedown0 annotations: checksum/config: {{ $configSHA }} {{- include "hpcc.generateAnnotations" $commonCtx | indent 8 }} diff --git a/helm/hpcc/templates/dali.yaml b/helm/hpcc/templates/dali.yaml index b37ffaa8653..67c61f8e04a 100644 --- a/helm/hpcc/templates/dali.yaml +++ b/helm/hpcc/templates/dali.yaml @@ -84,7 +84,7 @@ spec: run: {{ $dali.name | quote }} server: {{ $dali.name | quote }} app: dali - helmVersion: 9.6.5-closedown0 + helmVersion: 9.6.7-closedown0 {{- if hasKey $.Values.global "metrics" }} {{- include "hpcc.generateMetricsReporterLabel" $.Values.global.metrics | nindent 8 }} {{- end }} diff --git a/helm/hpcc/templates/dfuserver.yaml b/helm/hpcc/templates/dfuserver.yaml index 1d74eee1f84..abd657e1116 100644 --- a/helm/hpcc/templates/dfuserver.yaml +++ b/helm/hpcc/templates/dfuserver.yaml @@ -57,7 +57,7 @@ spec: {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "dfuserver" "name" "dfuserver" "instance" .name) | indent 8 }} run: {{ .name | quote }} accessDali: "yes" - helmVersion: 9.6.5-closedown0 + helmVersion: 9.6.7-closedown0 {{- if hasKey . "labels" }} {{ toYaml .labels | indent 8 }} {{- end }} diff --git a/helm/hpcc/templates/eclagent.yaml b/helm/hpcc/templates/eclagent.yaml index 747a39c0fc9..ecb9a3fb0e6 100644 --- a/helm/hpcc/templates/eclagent.yaml +++ b/helm/hpcc/templates/eclagent.yaml @@ -60,7 +60,7 @@ data: {{- include "hpcc.addStandardLabels" (dict "root" $ "component" $apptype "name" "eclagent" "instance" $appJobName "instanceOf" (printf "%s-job" .me.name)) | indent 12 }} accessDali: "yes" accessEsp: "yes" - helmVersion: 9.6.5-closedown0 + helmVersion: 9.6.7-closedown0 {{- if hasKey .me "labels" }} {{ toYaml .me.labels | indent 12 }} {{- end }} @@ -140,7 +140,7 @@ spec: run: {{ .name | quote }} accessDali: "yes" accessEsp: {{ .useChildProcesses | default false | ternary "yes" "no" | quote }} - helmVersion: 9.6.5-closedown0 + helmVersion: 9.6.7-closedown0 {{- if hasKey . "labels" }} {{ toYaml .labels | indent 8 }} {{- end }} diff --git a/helm/hpcc/templates/eclccserver.yaml b/helm/hpcc/templates/eclccserver.yaml index 4f51c0d922e..9fae0b41e17 100644 --- a/helm/hpcc/templates/eclccserver.yaml +++ b/helm/hpcc/templates/eclccserver.yaml @@ -58,7 +58,7 @@ data: {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "eclccserver" "name" "eclccserver" "instance" $compileJobName "instanceOf" (printf "%s-job" .me.name)) | indent 12 }} accessDali: "yes" accessEsp: "yes" - helmVersion: 9.6.5-closedown0 + helmVersion: 9.6.7-closedown0 {{- if hasKey .me "labels" }} {{ toYaml .me.labels | indent 12 }} {{- end }} @@ -146,7 +146,7 @@ spec: run: {{ .name | quote }} accessDali: "yes" accessEsp: {{ .useChildProcesses | default false | ternary "yes" "no" | quote }} - helmVersion: 9.6.5-closedown0 + helmVersion: 9.6.7-closedown0 {{- if hasKey . "labels" }} {{ toYaml .labels | indent 8 }} {{- end }} diff --git a/helm/hpcc/templates/eclscheduler.yaml b/helm/hpcc/templates/eclscheduler.yaml index fa3df4ad441..b84035e1c92 100644 --- a/helm/hpcc/templates/eclscheduler.yaml +++ b/helm/hpcc/templates/eclscheduler.yaml @@ -65,7 +65,7 @@ spec: run: {{ .name | quote }} accessDali: "yes" accessEsp: "no" - helmVersion: 9.6.5-closedown0 + helmVersion: 9.6.7-closedown0 {{- if hasKey . "labels" }} {{ toYaml .labels | indent 8 }} {{- end }} diff --git a/helm/hpcc/templates/esp.yaml b/helm/hpcc/templates/esp.yaml index 91e2bbc7ac6..bfe3693ed35 100644 --- a/helm/hpcc/templates/esp.yaml +++ b/helm/hpcc/templates/esp.yaml @@ -125,7 +125,7 @@ spec: accessSasha: "yes" {{- end }} app: {{ $application }} - helmVersion: 9.6.5-closedown0 + helmVersion: 9.6.7-closedown0 {{- include "hpcc.addStandardLabels" (dict "root" $ "name" $application "component" "esp" "instance" .name) | indent 8 }} {{- if hasKey $.Values.global "metrics" }} {{- include "hpcc.generateMetricsReporterLabel" $.Values.global.metrics | nindent 8 }} diff --git a/helm/hpcc/templates/localroxie.yaml b/helm/hpcc/templates/localroxie.yaml index 37b0765c799..e86052bfc6d 100644 --- a/helm/hpcc/templates/localroxie.yaml +++ b/helm/hpcc/templates/localroxie.yaml @@ -73,7 +73,7 @@ spec: server: {{ $servername | quote }} accessDali: "yes" accessEsp: "yes" - helmVersion: 9.6.5-closedown0 + helmVersion: 9.6.7-closedown0 {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "roxie-server" "name" "roxie" "instance" $roxie.name) | indent 8 }} {{- if hasKey . "labels" }} {{ toYaml .labels | indent 8 }} diff --git a/helm/hpcc/templates/roxie.yaml b/helm/hpcc/templates/roxie.yaml index c8fe0071088..ae0d2d2d4f8 100644 --- a/helm/hpcc/templates/roxie.yaml +++ b/helm/hpcc/templates/roxie.yaml @@ -125,7 +125,7 @@ spec: {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "topology-server" "name" "roxie" "instance" $commonCtx.toponame) | indent 8 }} run: {{ $commonCtx.toponame | quote }} roxie-cluster: {{ $roxie.name | quote }} - helmVersion: 9.6.5-closedown0 + helmVersion: 9.6.7-closedown0 {{- if hasKey $.Values.global "metrics" }} {{- include "hpcc.generateMetricsReporterLabel" $.Values.global.metrics | nindent 8}} {{- end }} @@ -184,7 +184,7 @@ kind: Service metadata: name: {{ $commonCtx.toponame | quote }} labels: - helmVersion: 9.6.5-closedown0 + helmVersion: 9.6.7-closedown0 {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "topology-server" "name" "roxie" "instance" $commonCtx.toponame) | indent 4 }} spec: ports: @@ -246,7 +246,7 @@ spec: roxie-cluster: {{ $roxie.name | quote }} accessDali: "yes" accessEsp: "yes" - helmVersion: 9.6.5-closedown0 + helmVersion: 9.6.7-closedown0 {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "roxie-server" "name" "roxie" "instance" $servername) | indent 8 }} {{- if hasKey $.Values.global "metrics" }} {{- include "hpcc.generateMetricsReporterLabel" $.Values.global.metrics | nindent 8}} @@ -357,7 +357,7 @@ spec: roxie-cluster: {{ $roxie.name | quote }} accessDali: "yes" accessEsp: "yes" - helmVersion: 9.6.5-closedown0 + helmVersion: 9.6.7-closedown0 {{- if hasKey $.Values.global "metrics" }} {{- include "hpcc.generateMetricsReporterLabel" $.Values.global.metrics | nindent 8}} {{- end }} diff --git a/helm/hpcc/templates/sasha.yaml b/helm/hpcc/templates/sasha.yaml index a5aed6933ba..51565b4237e 100644 --- a/helm/hpcc/templates/sasha.yaml +++ b/helm/hpcc/templates/sasha.yaml @@ -53,7 +53,7 @@ spec: server: {{ $serviceName | quote }} app: sasha accessDali: {{ (has "dali" $sasha.access) | ternary "yes" "no" | quote }} - helmVersion: 9.6.5-closedown0 + helmVersion: 9.6.7-closedown0 {{- if hasKey $sasha "labels" }} {{ toYaml $sasha.labels | indent 8 }} {{- end }} diff --git a/helm/hpcc/templates/thor.yaml b/helm/hpcc/templates/thor.yaml index cf9e7693ea8..b05b3c2bdfa 100644 --- a/helm/hpcc/templates/thor.yaml +++ b/helm/hpcc/templates/thor.yaml @@ -86,7 +86,7 @@ data: labels: accessDali: "yes" accessEsp: "yes" - helmVersion: 9.6.5-closedown0 + helmVersion: 9.6.7-closedown0 {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "eclagent" "name" "thor" "instance" $eclAgentJobName "instanceOf" (printf "%s-job" .eclAgentName)) | indent 8 }} {{- if hasKey .me "labels" }} {{ toYaml .me.labels | indent 12 }} @@ -154,7 +154,7 @@ data: accessEsp: "yes" app: "thor" component: "thormanager" - helmVersion: 9.6.5-closedown0 + helmVersion: 9.6.7-closedown0 instance: "_HPCC_JOBNAME_" job: "_HPCC_JOBNAME_" {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "thormanager" "name" "thor" "instance" $thorManagerJobName "instanceOf" (printf "%s-thormanager-job" .me.name)) | indent 12 }} @@ -224,7 +224,7 @@ data: accessEsp: "yes" app: "thor" component: "thorworker" - helmVersion: 9.6.5-closedown0 + helmVersion: 9.6.7-closedown0 instance: "_HPCC_JOBNAME_" job: "_HPCC_JOBNAME_" {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "thorworker" "name" "thor" "instance" $thorWorkerJobName "instanceOf" (printf "%s-thorworker-job" .me.name)) | indent 12 }} @@ -360,7 +360,7 @@ spec: accessEsp: {{ $commonCtx.eclAgentUseChildProcesses | ternary "yes" "no" | quote }} app: "thor" component: "thor-eclagent" - helmVersion: 9.6.5-closedown0 + helmVersion: 9.6.7-closedown0 instance: {{ $commonCtx.eclAgentName | quote }} {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "eclagent" "name" "thor" "instance" $commonCtx.eclAgentName ) | indent 8 }} {{- if hasKey $commonCtx.me "labels" }} @@ -428,7 +428,7 @@ spec: accessEsp: "no" app: "thor" component: "thor-thoragent" - helmVersion: 9.6.5-closedown0 + helmVersion: 9.6.7-closedown0 instance: {{ $commonCtx.thorAgentName | quote }} {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "eclagent" "name" "thor" "instance" $commonCtx.thorAgentName ) | indent 8 }} {{- if hasKey $commonCtx.me "labels" }} diff --git a/version.cmake b/version.cmake index 75516f9a719..6d27ecacc3c 100644 --- a/version.cmake +++ b/version.cmake @@ -5,8 +5,8 @@ set ( HPCC_NAME "Community Edition" ) set ( HPCC_PROJECT "community" ) set ( HPCC_MAJOR 9 ) set ( HPCC_MINOR 6 ) -set ( HPCC_POINT 5 ) +set ( HPCC_POINT 7 ) set ( HPCC_MATURITY "closedown" ) set ( HPCC_SEQUENCE 0 ) -set ( HPCC_TAG_TIMESTAMP "2024-04-11T16:27:45Z" ) +set ( HPCC_TAG_TIMESTAMP "2024-04-18T15:57:23Z" ) ### From bec27816670ec593b144a0ee0c839db1162eebf0 Mon Sep 17 00:00:00 2001 From: Jeremy Clements <79224539+jeclrsg@users.noreply.github.com> Date: Thu, 18 Apr 2024 15:21:07 -0400 Subject: [PATCH 11/44] HPCC-31517 ECL Watch v9 fix Activities page Open button for WUs If a selected item from the activities list is a workunit, the url used by the open button should link to the WU's details page Signed-off-by: Jeremy Clements <79224539+jeclrsg@users.noreply.github.com> --- esp/src/src-react/components/Activities.tsx | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/esp/src/src-react/components/Activities.tsx b/esp/src/src-react/components/Activities.tsx index 0f1103c7a1f..3339d5c1a82 100644 --- a/esp/src/src-react/components/Activities.tsx +++ b/esp/src/src-react/components/Activities.tsx @@ -178,10 +178,18 @@ export const Activities: React.FunctionComponent = ({ key: "open", text: nlsHPCC.Open, disabled: !uiState.wuSelected && !uiState.thorClusterSelected, iconProps: { iconName: "WindowEdit" }, onClick: () => { if (selection.length === 1) { - window.location.href = `#/operations/clusters/${selection[0].ClusterName}`; + let url = `#/operations/clusters/${selection[0].ClusterName}`; + if (selection[0].Wuid) { + url = `#/workunits/${selection[0].Wuid}`; + } + window.location.href = url; } else { for (let i = selection.length - 1; i >= 0; --i) { - window.open(`#/operations/clusters/${selection[i].ClusterName}`, "_blank"); + let url = `#/operations/clusters/${selection[i].ClusterName}`; + if (selection[i].Wuid) { + url = `#/workunits/${selection[i].Wuid}`; + } + window.open(url, "_blank"); } } } From 7950dbca3c0b7ea16b2f3d718fa907eefc4475ee Mon Sep 17 00:00:00 2001 From: Shamser Ahmed Date: Tue, 16 Apr 2024 10:45:05 +0100 Subject: [PATCH 12/44] HPCC-31618 Internal clients use latest version of ESP services unless generated_client_version specified This change updates internal clients so that they use latest version of ESP services by default. The new generated_client_version attribute has been implemented that may be used to override this behavour and to allow a specific version to be specified for internal clients. generated_client_version has been used to ensure that this change to default behaviour does not affect any existing services other than ws_fs. FileServices plugin requires the latest version. The following services use generated_client_version to ensure that they continue to use the same version as before: ws_access, WsCloud, WsESDLConfig, WsLoggingService, ws_machine, WsResources, WsTopology, WsUseMethodName and WsUseRequestName. Signed-off-by: Shamser Ahmed --- esp/scm/ws_access.ecm | 2 +- esp/scm/ws_cloud.ecm | 2 +- esp/scm/ws_configmgr.ecm | 2 +- esp/scm/ws_esdlconfig.ecm | 2 +- esp/scm/ws_loggingservice.ecm | 2 +- esp/scm/ws_machine.ecm | 2 +- esp/scm/ws_resources.ecm | 2 +- esp/scm/ws_topology.ecm | 2 +- testing/esp/esdlcmd/inputs/ws_usemethodname.ecm | 2 +- testing/esp/esdlcmd/inputs/ws_userequestname.ecm | 2 +- tools/hidl/hidlcomp.cpp | 13 ++++++++----- 11 files changed, 18 insertions(+), 15 deletions(-) diff --git a/esp/scm/ws_access.ecm b/esp/scm/ws_access.ecm index da34ed9dd5d..a00a43e95e8 100644 --- a/esp/scm/ws_access.ecm +++ b/esp/scm/ws_access.ecm @@ -1006,7 +1006,7 @@ ESPresponse [nil_remove] UserAccountExportResponse [http_content("application/octet-stream")] binary Result; }; -ESPservice [version("1.17"), auth_feature("NONE"), exceptions_inline("./smc_xslt/exceptions.xslt")] ws_access +ESPservice [version("1.17"), generated_client_version("0.0"), auth_feature("NONE"), exceptions_inline("./smc_xslt/exceptions.xslt")] ws_access { ESPmethod [client_xslt("/esp/xslt/access_users.xslt")] Users(UserRequest, UserResponse); ESPmethod [client_xslt("/esp/xslt/access_useredit.xslt")] UserEdit(UserEditRequest, UserEditResponse); diff --git a/esp/scm/ws_cloud.ecm b/esp/scm/ws_cloud.ecm index f50f0e5b2ae..2b662bc6934 100644 --- a/esp/scm/ws_cloud.ecm +++ b/esp/scm/ws_cloud.ecm @@ -35,7 +35,7 @@ ESPresponse [encode(0)] GetServicesResponse [json_inline(1)] string Result; }; -ESPservice [auth_feature("CloudAccess:ACCESS"), version("1.01"), exceptions_inline("./smc_xslt/exceptions.xslt")] WsCloud +ESPservice [auth_feature("CloudAccess:ACCESS"), version("1.01"), generated_client_version("0.0"), exceptions_inline("./smc_xslt/exceptions.xslt")] WsCloud { ESPmethod [auth_feature("CloudAccess:READ")] GetPODs(GetPODsRequest, GetPODsResponse); ESPmethod [auth_feature("CloudAccess:READ"), min_ver("1.01")] GetServices(GetServicesRequest, GetServicesResponse); diff --git a/esp/scm/ws_configmgr.ecm b/esp/scm/ws_configmgr.ecm index 455b49c97f6..fa72a3588f7 100644 --- a/esp/scm/ws_configmgr.ecm +++ b/esp/scm/ws_configmgr.ecm @@ -440,7 +440,7 @@ ESPrequest WizardTestRequest -ESPservice [auth_feature("DEFERRED"),version("2.0"), default_client_version("2.0"), exceptions_inline("xslt/exceptions.xslt"), disable_profile_execution] ws_configmgr +ESPservice [auth_feature("DEFERRED"), version("2.0"), default_client_version("2.0"), exceptions_inline("xslt/exceptions.xslt"), disable_profile_execution] ws_configmgr { ESPMethod [ diff --git a/esp/scm/ws_esdlconfig.ecm b/esp/scm/ws_esdlconfig.ecm index aa2214cd4fa..a3dec5c9854 100644 --- a/esp/scm/ws_esdlconfig.ecm +++ b/esp/scm/ws_esdlconfig.ecm @@ -306,7 +306,7 @@ ESPresponse [exceptions_inline] ListESDLBindingsResponse }; #define VERSION_FOR_ESDLCMD "1.5" -ESPservice [auth_feature("ESDLConfigAccess:ACCESS"), version("1.5"), exceptions_inline("./smc_xslt/exceptions.xslt")] WsESDLConfig +ESPservice [auth_feature("ESDLConfigAccess:ACCESS"), version("1.5"), generated_client_version("0.0"), exceptions_inline("./smc_xslt/exceptions.xslt")] WsESDLConfig { ESPmethod Echo(EchoRequest, EchoResponse); ESPmethod [auth_feature("ESDLConfigAccess:WRITE")] PublishESDLDefinition(PublishESDLDefinitionRequest, PublishESDLDefinitionResponse); diff --git a/esp/scm/ws_loggingservice.ecm b/esp/scm/ws_loggingservice.ecm index be329b88dc6..59a43fead84 100644 --- a/esp/scm/ws_loggingservice.ecm +++ b/esp/scm/ws_loggingservice.ecm @@ -52,7 +52,7 @@ ESPresponse [exceptions_inline] UpdateLogResponse string StatusMessage; }; -ESPService [auth_feature("DEFERRED"), version("1.0"), noforms, use_method_name] WsLoggingService +ESPService [auth_feature("DEFERRED"), version("1.0"), generated_client_version("0.0"), noforms, use_method_name] WsLoggingService { ESPmethod GetTransactionSeed(GetTransactionSeedRequest, GetTransactionSeedResponse); ESPmethod UpdateLog(UpdateLogRequest, UpdateLogResponse); diff --git a/esp/scm/ws_machine.ecm b/esp/scm/ws_machine.ecm index 5224ff02b7e..78322b0d307 100644 --- a/esp/scm/ws_machine.ecm +++ b/esp/scm/ws_machine.ecm @@ -457,7 +457,7 @@ ESPresponse [encode(0), nil_remove, exceptions_inline] GetNodeGroupUsageResponse }; //-------- service --------- -ESPservice [auth_feature("DEFERRED"), version("1.18")] ws_machine +ESPservice [auth_feature("DEFERRED"), version("1.18"), generated_client_version("0.0")] ws_machine { ESPmethod [resp_xsl_default("./smc_xslt/clusterprocesses.xslt"), exceptions_inline("./smc_xslt/exceptions.xslt")] GetTargetClusterInfo(GetTargetClusterInfoRequest, GetTargetClusterInfoResponse); diff --git a/esp/scm/ws_resources.ecm b/esp/scm/ws_resources.ecm index f41d77d19ba..12f100b0cc4 100644 --- a/esp/scm/ws_resources.ecm +++ b/esp/scm/ws_resources.ecm @@ -113,7 +113,7 @@ ESPresponse [nil_remove, exceptions_inline] TargetQueryResponse ESParray Roxies; }; -ESPservice [auth_feature("ResourceQueryAccess:ACCESS"), version("1.03"), exceptions_inline("./smc_xslt/exceptions.xslt"), disable_profile_execution] WsResources +ESPservice [auth_feature("ResourceQueryAccess:ACCESS"), version("1.03"), generated_client_version("0.0"), exceptions_inline("./smc_xslt/exceptions.xslt"), disable_profile_execution] WsResources { ESPmethod [auth_feature("ResourceQueryAccess:READ"), min_ver("1.03")] TargetQuery(TargetQueryRequest, TargetQueryResponse); ESPmethod [auth_feature("ResourceQueryAccess:READ")] ServiceQuery(ServiceQueryRequest, ServiceQueryResponse); diff --git a/esp/scm/ws_topology.ecm b/esp/scm/ws_topology.ecm index ca67e8bcf78..a7e7e33c3cc 100644 --- a/esp/scm/ws_topology.ecm +++ b/esp/scm/ws_topology.ecm @@ -665,7 +665,7 @@ ESPresponse [exceptions_inline] TpListLogFilesResponse ESParray Files; }; -ESPservice [auth_feature("DEFERRED"), noforms, version("1.32"), cache_group("ESPWsTP"), exceptions_inline("./smc_xslt/exceptions.xslt")] WsTopology +ESPservice [auth_feature("DEFERRED"), noforms, version("1.32"), generated_client_version("0.0"), cache_group("ESPWsTP"), exceptions_inline("./smc_xslt/exceptions.xslt")] WsTopology { ESPmethod [cache_seconds(180), cache_global(1), resp_xsl_default("/esp/xslt/targetclusters.xslt")] TpTargetClusterQuery(TpTargetClusterQueryRequest, TpTargetClusterQueryResponse); ESPmethod [cache_seconds(180), cache_global(1), resp_xsl_default("/esp/xslt/topology.xslt")] TpClusterQuery(TpClusterQueryRequest, TpClusterQueryResponse); diff --git a/testing/esp/esdlcmd/inputs/ws_usemethodname.ecm b/testing/esp/esdlcmd/inputs/ws_usemethodname.ecm index 6a51a81a902..34c2172cdb0 100644 --- a/testing/esp/esdlcmd/inputs/ws_usemethodname.ecm +++ b/testing/esp/esdlcmd/inputs/ws_usemethodname.ecm @@ -25,7 +25,7 @@ ESPresponse OrangeResponse bool Peels; }; -ESPservice[version("1"), use_method_name] WsUseMethodName +ESPservice[version("1"), generated_client_version("0.0"), use_method_name] WsUseMethodName { ESPmethod Unique(FooRequest, FooResponse); ESPmethod Apple(FruitRequest, FruitResponse); diff --git a/testing/esp/esdlcmd/inputs/ws_userequestname.ecm b/testing/esp/esdlcmd/inputs/ws_userequestname.ecm index c587485a189..db0812a3095 100644 --- a/testing/esp/esdlcmd/inputs/ws_userequestname.ecm +++ b/testing/esp/esdlcmd/inputs/ws_userequestname.ecm @@ -25,7 +25,7 @@ ESPresponse OrangeResponse bool Peels; }; -ESPservice[version("1")] WsUseRequestName +ESPservice[version("1"), generated_client_version("0.0")] WsUseRequestName { ESPmethod Unique(FooRequest, FooResponse); ESPmethod Apple(FruitRequest, FruitResponse); diff --git a/tools/hidl/hidlcomp.cpp b/tools/hidl/hidlcomp.cpp index b2328b909cb..37e22303ae6 100644 --- a/tools/hidl/hidlcomp.cpp +++ b/tools/hidl/hidlcomp.cpp @@ -4914,12 +4914,15 @@ void EspServInfo::write_esp_client_ipp() outs("\tIMPLEMENT_IINTERFACE;\n\n"); outf("\tCClient%s()\n\t{\n", name_); - outs("\t\tsoap_reqid=0;\n\t"); - outf("\t\tsoap_action.append(\"%s\");\n\t", name_); - const char *ver = getMetaString("default_client_version", NULL); + outs("\t\tsoap_reqid=0;\n"); + outf("\t\tsoap_action.append(\"%s\");\n", name_); + // use latest 'version' unless 'generated_client_version' provided + const char *ver = getMetaString("generated_client_version", nullptr); + if (!ver || !*ver) + ver = getMetaString("version", nullptr); if (ver && *ver) - outf("\t\tsoap_action.append(\"?ver_=\").append(%s);\n\t", ver); - outf("}\n\tvirtual ~CClient%s(){}\n", name_); + outf("\t\tsoap_action.append(\"?ver_=\").append(%s);\n", ver); + outf("\t}\n\tvirtual ~CClient%s(){}\n", name_); outs("\tvirtual void setProxyAddress(const char *address)\n\t{\n\t\tsoap_proxy.set(address);\n\t}\n"); outs("\tvirtual void addServiceUrl(const char *url)\n\t{\n\t\tsoap_url.set(url);\n\t}\n"); From 97b056073f340ad26ea6062b7c0466b338e24a99 Mon Sep 17 00:00:00 2001 From: "Dan S. Camper" Date: Thu, 18 Apr 2024 14:00:51 -0500 Subject: [PATCH 13/44] HPCC-31454 Enable Parquet interface in client tools Shared library is not available in client tools, but it can at least be referenced in ECL code. --- cmake_modules/commonSetup.cmake | 1 + common/thorhelper/thorread.cpp | 4 +++- common/thorhelper/thorread.hpp | 2 ++ plugins/parquet/parquetembed.hpp | 2 -- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/cmake_modules/commonSetup.cmake b/cmake_modules/commonSetup.cmake index 660b68fefd9..65920459734 100644 --- a/cmake_modules/commonSetup.cmake +++ b/cmake_modules/commonSetup.cmake @@ -135,6 +135,7 @@ IF ("${COMMONSETUP_DONE}" STREQUAL "") if ( CLIENTTOOLS_ONLY ) set(PLATFORM OFF) set(DEVEL OFF) + set(USE_PARQUET OFF) endif() # The following options need to be set after the project() command diff --git a/common/thorhelper/thorread.cpp b/common/thorhelper/thorread.cpp index d1dd5169a69..e05ed699117 100644 --- a/common/thorhelper/thorread.cpp +++ b/common/thorhelper/thorread.cpp @@ -2037,7 +2037,7 @@ IDiskRowReader * doCreateLocalDiskReader(const char * format, IDiskReadMapping * { auto foundReader = genericFileTypeMap.find(format); - if (foundReader != genericFileTypeMap.end()) + if (foundReader != genericFileTypeMap.end() && foundReader->second) return foundReader->second(_mapping); UNIMPLEMENTED; @@ -2087,6 +2087,8 @@ MODULE_INIT(INIT_PRIORITY_STANDARD) genericFileTypeMap.emplace("xml", [](IDiskReadMapping * _mapping) { return new XmlDiskRowReader(_mapping); }); #ifdef _USE_PARQUET genericFileTypeMap.emplace(PARQUET_FILE_TYPE_NAME, [](IDiskReadMapping * _mapping) { return new ParquetDiskRowReader(_mapping); }); +#else + genericFileTypeMap.emplace(PARQUET_FILE_TYPE_NAME, [](IDiskReadMapping * _mapping) { return nullptr; }); #endif // Stuff the file type names that were just instantiated into a list; diff --git a/common/thorhelper/thorread.hpp b/common/thorhelper/thorread.hpp index ab6101e2a5b..8179354c70b 100644 --- a/common/thorhelper/thorread.hpp +++ b/common/thorhelper/thorread.hpp @@ -27,6 +27,8 @@ #include "jrowstream.hpp" #include "rtlkey.hpp" +#define PARQUET_FILE_TYPE_NAME "parquet" + //--- Classes and interfaces for reading instances of files //The following is constant for the life of a disk read activity interface IDiskReadOutputMapping : public IInterface diff --git a/plugins/parquet/parquetembed.hpp b/plugins/parquet/parquetembed.hpp index 39a3e3c5aef..7becd2324db 100644 --- a/plugins/parquet/parquetembed.hpp +++ b/plugins/parquet/parquetembed.hpp @@ -45,8 +45,6 @@ extern void UNSUPPORTED(const char *feature) __attribute__((noreturn)); extern void failx(const char *msg, ...) __attribute__((noreturn)) __attribute__((format(printf, 1, 2))); extern void fail(const char *msg) __attribute__((noreturn)); -#define PARQUET_FILE_TYPE_NAME "parquet" - #define reportIfFailure(st) \ if (!st.ok()) \ { \ From 8b69d5ae1f91e8f8473567a1b790191a273dd065 Mon Sep 17 00:00:00 2001 From: Gordon Smith Date: Fri, 19 Apr 2024 13:24:11 +0100 Subject: [PATCH 14/44] HPCC-31315 Separate Cost and Penality in WU Details Signed-off-by: Gordon Smith --- esp/src/src-react/components/InfoGrid.tsx | 17 ++++++++++++++--- .../src-react/components/WorkunitSummary.tsx | 4 ++-- esp/src/src/Session.ts | 2 +- esp/src/src/nls/hpcc.ts | 2 ++ 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/esp/src/src-react/components/InfoGrid.tsx b/esp/src/src-react/components/InfoGrid.tsx index 6b8a84329a3..aaa30880c01 100644 --- a/esp/src/src-react/components/InfoGrid.tsx +++ b/esp/src/src-react/components/InfoGrid.tsx @@ -1,11 +1,11 @@ import * as React from "react"; import { Checkbox, CommandBar, ICommandBarItemProps, Link } from "@fluentui/react"; import { SizeMe } from "react-sizeme"; +import { formatCost, formatTwoDigits } from "src/Session"; import nlsHPCC from "src/nlsHPCC"; import { useWorkunitExceptions } from "../hooks/workunit"; import { FluentGrid, useCopyButtons, useFluentStoreState, FluentColumns } from "./controls/Grid"; import { pivotItemStyle } from "../layouts/pivot"; -import { formatCost } from "src/Session"; function extractGraphInfo(msg) { const regex = /^([a-zA-Z0-9 :]+: )(graph graph(\d+)\[(\d+)\], )(([a-zA-Z]+)\[(\d+)\]: )?(.*)$/gmi; @@ -24,6 +24,7 @@ function extractGraphInfo(msg) { interface FilterCounts { cost: number, + penalty: number, error: number, warning: number, info: number, @@ -43,7 +44,7 @@ export const InfoGrid: React.FunctionComponent = ({ const [warningChecked, setWarningChecked] = React.useState(true); const [infoChecked, setInfoChecked] = React.useState(true); const [otherChecked, setOtherChecked] = React.useState(true); - const [filterCounts, setFilterCounts] = React.useState({ cost: 0, error: 0, warning: 0, info: 0, other: 0 }); + const [filterCounts, setFilterCounts] = React.useState({ cost: 0, penalty: 0, error: 0, warning: 0, info: 0, other: 0 }); const [exceptions] = useWorkunitExceptions(wuid); const [data, setData] = React.useState([]); const { @@ -83,11 +84,20 @@ export const InfoGrid: React.FunctionComponent = ({ label: `${nlsHPCC.Source} / ${nlsHPCC.Cost}`, field: "", width: 144, sortable: false, formatter: (Source, row) => { if (Source === "Cost Optimizer") { - return formatCost(+row.Priority); + return formatCost(+row.Cost); } return Source; } }, + Priority: { + label: `${nlsHPCC.Priority} / ${nlsHPCC.TimePenalty}`, field: "", width: 144, sortable: false, + formatter: (Priority, row) => { + if (row.Source === "Cost Optimizer") { + return `${formatTwoDigits(+row.Priority / 1000)} (${nlsHPCC.Seconds})`; + } + return Priority; + } + }, Code: { label: nlsHPCC.Code, field: "", width: 45, sortable: false }, Message: { label: nlsHPCC.Message, field: "", @@ -121,6 +131,7 @@ export const InfoGrid: React.FunctionComponent = ({ React.useEffect(() => { const filterCounts: FilterCounts = { cost: 0, + penalty: 0, error: 0, warning: 0, info: 0, diff --git a/esp/src/src-react/components/WorkunitSummary.tsx b/esp/src/src-react/components/WorkunitSummary.tsx index 014fec2725d..bda5d21d8eb 100644 --- a/esp/src/src-react/components/WorkunitSummary.tsx +++ b/esp/src/src-react/components/WorkunitSummary.tsx @@ -177,8 +177,8 @@ export const WorkunitSummary: React.FunctionComponent = ({ const potentialSavings = React.useMemo(() => { return exceptions.reduce((prev, cur) => { - if (isNumeric(cur.Priority)) { - prev += cur.Priority; + if (isNumeric(cur.Cost)) { + prev += cur.Cost; } return prev; }, 0) || 0; diff --git a/esp/src/src/Session.ts b/esp/src/src/Session.ts index 4fe21ceec71..4d150f4c09d 100644 --- a/esp/src/src/Session.ts +++ b/esp/src/src/Session.ts @@ -120,7 +120,7 @@ getBuildInfo().then(info => { dojoConfig.currencyCode = info["currencyCode"] ?? ""; }); -const formatTwoDigits = d3Format(",.2f"); +export const formatTwoDigits = d3Format(",.2f"); const formatSixDigits = d3Format(",.6f"); export function formatCost(value): string { if (isNaN(value)) { diff --git a/esp/src/src/nls/hpcc.ts b/esp/src/src/nls/hpcc.ts index 5d22070f349..b7c1ea32962 100644 --- a/esp/src/src/nls/hpcc.ts +++ b/esp/src/src/nls/hpcc.ts @@ -835,6 +835,7 @@ export = { Save: "Save", Scope: "Scope", SearchResults: "Search Results", + Seconds: "Seconds", SecondsRemaining: "Seconds Remaining", Security: "Security", SecurityWarning: "Security Warning", @@ -959,6 +960,7 @@ export = { TimeMaxTotalExecuteMinutes: "Time Max Total Execute Minutes", TimeMeanTotalExecuteMinutes: "Time Mean Total Execute Minutes", TimeMinTotalExecuteMinutes: "Time Min Total Execute Minutes", + TimePenalty: "Time Penalty", TimeStamp: "Time Stamp", TimeSeconds: "Time (Seconds)", TimeStarted: "Time Started", From 405f292acb48d88fbf0d58e98008284b0f8d2161 Mon Sep 17 00:00:00 2001 From: Jake Smith Date: Fri, 19 Apr 2024 18:21:12 +0100 Subject: [PATCH 15/44] HPCC-31652 Guard against calculateSkew causing attach to fail When attaching a file to DFS it performs a skew calculation, which may check physical file parts if there are missing size attributes. If a physical file is missing during this process, it will cause attach() to fail. A pull Roxie attaches a logical file without the physical files being present, if size attributes are missing it will fail. Protect against this failure in the skew calculation (catch exception, log and continue). Signed-off-by: Jake Smith --- dali/base/dadfs.cpp | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/dali/base/dadfs.cpp b/dali/base/dadfs.cpp index 1ad137e69ef..26973d14f81 100644 --- a/dali/base/dadfs.cpp +++ b/dali/base/dadfs.cpp @@ -3566,23 +3566,33 @@ class CDistributedFile: public CDistributedFileBase offset_t maxPartSz = 0, minPartSz = (offset_t)-1, totalPartSz = 0; - maxSkewPart = 0; - minSkewPart = 0; - for (unsigned p=0; p maxPartSz) - { - maxPartSz = size; - maxSkewPart = p; - } - if (size < minPartSz) + maxSkewPart = 0; + minSkewPart = 0; + for (unsigned p=0; p maxPartSz) + { + maxPartSz = size; + maxSkewPart = p; + } + if (size < minPartSz) + { + minPartSz = size; + minSkewPart = p; + } + totalPartSz += size; } - totalPartSz += size; + } + catch (IException *e) + { + // guard against getFileSize throwing an exception (if parts missing) + EXCLOG(e); + e->Release(); + return false; } offset_t avgPartSz = totalPartSz / np; if (0 == avgPartSz) From de2c904fb5bf7b722482069747fd4ba6cb3b1275 Mon Sep 17 00:00:00 2001 From: Jeremy Clements <79224539+jeclrsg@users.noreply.github.com> Date: Fri, 19 Apr 2024 16:08:44 -0400 Subject: [PATCH 16/44] HPCC-30718 ECL Watch v9 add remote storage to AddPackageMap Signed-off-by: Jeremy Clements <79224539+jeclrsg@users.noreply.github.com> --- .../components/forms/AddPackageMap.tsx | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/esp/src/src-react/components/forms/AddPackageMap.tsx b/esp/src/src-react/components/forms/AddPackageMap.tsx index 068c51aa3c5..c5e667a4815 100644 --- a/esp/src/src-react/components/forms/AddPackageMap.tsx +++ b/esp/src/src-react/components/forms/AddPackageMap.tsx @@ -1,6 +1,7 @@ import * as React from "react"; -import { Checkbox, DefaultButton, Dropdown, PrimaryButton, Stack, TextField, } from "@fluentui/react"; +import { Checkbox, DefaultButton, Dropdown, IDropdownOption, PrimaryButton, Stack, TextField, } from "@fluentui/react"; import { useForm, Controller } from "react-hook-form"; +import { FileSprayService } from "@hpcc-js/comms"; import { scopedLogger } from "@hpcc-js/util"; import * as WsPackageMaps from "src/WsPackageMaps"; import { TypedDropdownOption } from "../PackageMaps"; @@ -15,6 +16,7 @@ interface AddPackageMapValues { Target: string; Process: string; DaliIp: string; + RemoteStorage: string; Activate: boolean OverWrite: boolean; } @@ -25,10 +27,13 @@ const defaultValues: AddPackageMapValues = { Target: "", Process: "", DaliIp: "", + RemoteStorage: "", Activate: true, OverWrite: false }; +const fileSprayService = new FileSprayService({ baseUrl: "" }); + interface AddPackageMapProps { showForm: boolean; setShowForm: (_: boolean) => void; @@ -47,6 +52,14 @@ export const AddPackageMap: React.FunctionComponent = ({ const { handleSubmit, control, reset } = useForm({ defaultValues }); + const [remoteTargets, setRemoteTargets] = React.useState([]); + + React.useEffect(() => { + fileSprayService.GetRemoteTargets({}).then(response => { + setRemoteTargets(response?.TargetNames?.Item?.map(item => { return { key: item, text: item }; })); + }).catch(err => logger.error(err)); + }, []); + const closeForm = React.useCallback(() => { setShowForm(false); }, [setShowForm]); @@ -168,6 +181,21 @@ export const AddPackageMap: React.FunctionComponent = ({ value={value} />} /> + { + onChange(option.key); + }} + />} + />
Date: Mon, 22 Apr 2024 11:49:56 +0100 Subject: [PATCH 17/44] HPCC-31582 Metrics refresh does not refresh the timeline Signed-off-by: Gordon Smith --- esp/src/src-react/components/Metrics.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/esp/src/src-react/components/Metrics.tsx b/esp/src/src-react/components/Metrics.tsx index cfb5286a2a0..319fc145e59 100644 --- a/esp/src/src-react/components/Metrics.tsx +++ b/esp/src/src-react/components/Metrics.tsx @@ -516,6 +516,10 @@ export const Metrics: React.FunctionComponent = ({ key: "refresh", text: nlsHPCC.Refresh, iconProps: { iconName: "Refresh" }, onClick: () => { refresh(); + timeline + .clear() + .lazyRender() + ; } }, { @@ -536,7 +540,7 @@ export const Metrics: React.FunctionComponent = ({ setShowMetricOptions(true); } } - ], [dockpanel, hotspots, onHotspot, options, refresh, setOptions, showTimeline]); + ], [dockpanel, hotspots, onHotspot, options, refresh, setOptions, showTimeline, timeline]); const formatColumns = React.useMemo((): Utility.ColumnMap => { const copyColumns: Utility.ColumnMap = {}; From 33aa6fdf978514007d59d3156ac33b021c757f7a Mon Sep 17 00:00:00 2001 From: Gordon Smith Date: Mon, 22 Apr 2024 12:10:34 +0100 Subject: [PATCH 18/44] HPCC-31409 Update selection on metrics timeline click When selected update the selection list to match the selected item. When deselected, do nothing Signed-off-by: Gordon Smith --- esp/src/src-react/components/Metrics.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/esp/src/src-react/components/Metrics.tsx b/esp/src/src-react/components/Metrics.tsx index cfb5286a2a0..cba531f46b5 100644 --- a/esp/src/src-react/components/Metrics.tsx +++ b/esp/src/src-react/components/Metrics.tsx @@ -226,6 +226,10 @@ export const Metrics: React.FunctionComponent = ({ }) .on("click", (row, col, sel) => { setTimelineFilter(sel ? row[7].ScopeName : ""); + if (sel) { + setSelectedMetricsSource("scopesTable"); + pushUrl(`${parentUrl}/${row[7].Id}`); + } }) ); From f00c74845317dea57f39d71779671c3e824a5e06 Mon Sep 17 00:00:00 2001 From: Gordon Smith Date: Mon, 22 Apr 2024 12:43:15 +0100 Subject: [PATCH 19/44] HPCC-31412 Metrics column changes fail to render on OK Picking new columns wouldn't display until the user forced a refresh. Signed-off-by: Gordon Smith --- esp/src/src-react/components/Metrics.tsx | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/esp/src/src-react/components/Metrics.tsx b/esp/src/src-react/components/Metrics.tsx index cfb5286a2a0..1d6fca5c3d9 100644 --- a/esp/src/src-react/components/Metrics.tsx +++ b/esp/src/src-react/components/Metrics.tsx @@ -584,6 +584,17 @@ export const Metrics: React.FunctionComponent = ({ } ], [dot, formatColumns, fullscreen, metrics, wuid]); + const setShowMetricOptionsHook = React.useCallback((show: boolean) => { + setShowMetricOptions(show); + scopesTable + .metrics(metrics, options, timelineFilter, scopeFilter) + .render(() => { + updateScopesTable(selectedMetrics); + }) + ; + + }, [metrics, options, scopeFilter, scopesTable, selectedMetrics, timelineFilter, updateScopesTable]); + return @@ -624,7 +635,7 @@ export const Metrics: React.FunctionComponent = ({ - + } />; From 998c7a83b3f2121a12eff8812f38673dc53d5abd Mon Sep 17 00:00:00 2001 From: Gordon Smith Date: Mon, 22 Apr 2024 14:46:48 +0100 Subject: [PATCH 20/44] HPCC-31533 Sort metric properties to match scopes columns Signed-off-by: Gordon Smith --- esp/src/src-react/components/Metrics.tsx | 2 +- .../components/MetricsPropertiesTables.tsx | 27 ++++++++++++++++--- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/esp/src/src-react/components/Metrics.tsx b/esp/src/src-react/components/Metrics.tsx index cfb5286a2a0..8e169e3c877 100644 --- a/esp/src/src-react/components/Metrics.tsx +++ b/esp/src/src-react/components/Metrics.tsx @@ -618,7 +618,7 @@ export const Metrics: React.FunctionComponent = ({ /> - + diff --git a/esp/src/src-react/components/MetricsPropertiesTables.tsx b/esp/src/src-react/components/MetricsPropertiesTables.tsx index 031b5daf8ad..470516b55f7 100644 --- a/esp/src/src-react/components/MetricsPropertiesTables.tsx +++ b/esp/src/src-react/components/MetricsPropertiesTables.tsx @@ -6,13 +6,19 @@ import nlsHPCC from "src/nlsHPCC"; import { AutosizeHpccJSComponent } from "../layouts/HpccJSAdapter"; interface MetricsPropertiesTablesProps { + scopesTableColumns?: string[]; scopes?: IScope[]; } export const MetricsPropertiesTables: React.FunctionComponent = ({ + scopesTableColumns = [], scopes = [] }) => { + const sortByColumns = React.useMemo(() => { + return ["id", "type", "name", ...scopesTableColumns]; + }, [scopesTableColumns]); + // Props Table --- const propsTable = useConst(() => new Table() .columns([nlsHPCC.Property, nlsHPCC.Value, "Avg", "Min", "Max", "Delta", "StdDev", "SkewMin", "SkewMax", "NodeMin", "NodeMax"]) @@ -22,19 +28,34 @@ export const MetricsPropertiesTables: React.FunctionComponent { const props = []; scopes.forEach((item, idx) => { + const scopeProps = []; for (const key in item.__groupedProps) { const row = item.__groupedProps[key]; - props.push([row.Key, row.Value, row.Avg, row.Min, row.Max, row.Delta, row.StdDev, row.SkewMin, row.SkewMax, row.NodeMin, row.NodeMax]); + scopeProps.push([row.Key, row.Value, row.Avg, row.Min, row.Max, row.Delta, row.StdDev, row.SkewMin, row.SkewMax, row.NodeMin, row.NodeMax]); } + scopeProps.sort((l, r) => { + const lIdx = sortByColumns.indexOf(l[0]); + const rIdx = sortByColumns.indexOf(r[0]); + if (lIdx >= 0 && rIdx >= 0) { + return lIdx <= rIdx ? -1 : 1; + } else if (lIdx >= 0) { + return -1; + } else if (rIdx >= 0) { + return 1; + } + return 0; + }); if (idx < scopes.length - 1) { - props.push(["------------------------------", "------------------------------"]); + scopeProps.push(["------------------------------", "------------------------------"]); } + props.push(...scopeProps); }); + propsTable ?.data(props) ?.lazyRender() ; - }, [propsTable, scopes]); + }, [propsTable, scopes, sortByColumns]); return ; }; From bf13299bfe2f9c0c1ebf7474b3c10e270ff179bf Mon Sep 17 00:00:00 2001 From: Jack Del Vecchio Date: Fri, 12 Apr 2024 16:03:27 +0000 Subject: [PATCH 21/44] HPCC-28288 Add support for regex and timestamp types. --- plugins/mongodb/README.md | 10 +++-- plugins/mongodb/examples/mongodb-test.ecl | 24 +++++++++++ plugins/mongodb/mongodb.ecllib | 4 ++ plugins/mongodb/mongodbembed.cpp | 50 +++++++++-------------- 4 files changed, 55 insertions(+), 33 deletions(-) diff --git a/plugins/mongodb/README.md b/plugins/mongodb/README.md index 6c9747080d9..c9f2317c0e4 100755 --- a/plugins/mongodb/README.md +++ b/plugins/mongodb/README.md @@ -125,10 +125,14 @@ Not every ECL or MongoDB datatype translates seemlessly to the other side. | MongoDB datatypes | ECL equivalent | | ----------------- | -------------- | | b_date | STRING, INTEGER | -| b_regex | Unsupported | -| b_timestamp | Unsupported | +| b_regex | {String pattern, String options} | +| b_timestamp | {Unsigned t, Unsigned i} | -The MongoDB date datatype can be converted to an integer in MongoDB or it will automatically be converted to a STRING by the plugin. Typically Dates before 1970 get returned by MongoDB as INTEGERS. Also, Unsigned Integers are unsupported in MongoDB. This means that in order to insert UINTEGERs into the database the plugin converts them to b_int64 which is a 64 bit signed integer. +The MongoDB date datatype can be converted to an integer in MongoDB or it will automatically be converted to a STRING by the plugin. Typically Dates before 1970 get returned by MongoDB as INTEGERS. + +Due to regex and timestamp types being returned by MongoDB as objects, ECL records that map to these types are defined in the mongodb.ecllib file for your use. For information about the regex and timestamp types: [Manual](https://www.mongodb.com/docs/manual/reference/mongodb-extended-json/#bson-data-types-and-associated-representations) + +Unsigned Integers are unsupported in MongoDB. This means that in order to insert UINTEGERs into the database the plugin converts them to b_int64 which is a 64 bit signed integer. ### Inserting Documents diff --git a/plugins/mongodb/examples/mongodb-test.ecl b/plugins/mongodb/examples/mongodb-test.ecl index 08af1447304..902dbe4cf34 100644 --- a/plugins/mongodb/examples/mongodb-test.ecl +++ b/plugins/mongodb/examples/mongodb-test.ecl @@ -57,6 +57,18 @@ layoutDates := {STRING bucket_start_date, STRING bucket_end_date}; layoutEmployee := {INTEGER1 id, STRING25 first, STRING25 last, REAL salary}; layoutperson := {String username, String address, String email}; +layoutRegex := RECORD + STRING name; + INTEGER uniqueID; + mongodb.regexType regex; +END; + +layoutTimestamp := RECORD + STRING name; + INTEGER uniqueID; + mongodb.timestampType timestamp; +END; + // Example/Test functions // Returns the unique _id and name every document in the listingsAndReviews collection @@ -161,6 +173,16 @@ dataset(layoutEmployee) findInfo(BOOLEAN mybool) := EMBED(mongodb : user(user), ); ENDEMBED; +// Gets all the documents from the regexTest collection for testing the coversion of MongoDB regex data to ECL +dataset(layoutRegex) getRegex() := EMBED(mongodb : user(user), password(pwd), server(server), database('mydb'), collection('regexTest')) + find({}); +ENDEMBED; + +// Gets all the documents from the timestampTest collection for testing the coversion of MongoDB timestamp data to ECL +dataset(layoutTimestamp) getTimestamp() := EMBED(mongodb : user(user), password(pwd), server(server), database('mydb'), collection('timestampTest')) + find({}); +ENDEMBED; + // $or is not allowed in the M0 tier of MongoDB atlas INTEGER ppl := 8; // Matches all the documents that match either expression. Then it groups them by the number of beds they have and counts the number of documents in each group. @@ -193,6 +215,8 @@ SEQUENTIAL OUTPUT(insertMany(employeeDS), NAMED('InsertMany')); createIndex(1); OUTPUT(findInfo(mybool), NAMED('RemoveOnQuery')); + OUTPUT(getRegex(), NAMED('TestRegexSupport')); + OUTPUT(getTimestamp(), NAMED('TestTimestampSupport')); OUTPUT(findCountOR(nights,ppl), NAMED('OrCountAggregate')); OUTPUT('Done', Named('Status')); ); diff --git a/plugins/mongodb/mongodb.ecllib b/plugins/mongodb/mongodb.ecllib index 576dabe89a2..39ea5e08450 100644 --- a/plugins/mongodb/mongodb.ecllib +++ b/plugins/mongodb/mongodb.ecllib @@ -26,3 +26,7 @@ EXPORT boolean supportsScript := true; EXPORT updateResultRecord := {INTEGER matched_count, INTEGER modified_count}; EXPORT insertManyResultRecord := {INTEGER inserted_count}; EXPORT deleteResultRecord := {INTEGER deleted_count}; + +// For information about the regex and timestamp types: https://www.mongodb.com/docs/manual/reference/mongodb-extended-json/#bson-data-types-and-associated-representations +EXPORT regexType := {STRING pattern, STRING options}; +EXPORT timestampType := {UNSIGNED t, UNSIGNED i}; diff --git a/plugins/mongodb/mongodbembed.cpp b/plugins/mongodb/mongodbembed.cpp index 9b7c3a548c6..6333734a8f1 100755 --- a/plugins/mongodb/mongodbembed.cpp +++ b/plugins/mongodb/mongodbembed.cpp @@ -149,17 +149,16 @@ namespace mongodbembed std::string key = std::string(start, end - start); // Get datatype result += std::string(row, lastBrkt - row); // Add everything before we went into nested document // Some data types are unsupported as they are not straightforward to deserialize - if (key == "$regularExpression") + // Regex and timestamp both get deserialized to their child objects + if (key == "$regularExpression" || key == "$timestamp") { - UNSUPPORTED("Regular Expressions"); // TO DO handle unsupported types by not throwing an exception. - } - else if (key == "$timestamp") - { - while (*end && *end != '}') - end++; // Skip over timestamp - row = ++end; + // remove type identifier and create a nested object for the regex or timestamp values + while (*end && *end != '{') + end++; start = end; - result += "\"\""; + while (*end && *end != '}') + end++; + result += std::string(start, ++end - start); } // Both of these get deserialized to strings and are surround by quotation marks else if (key == "$date" || key == "$oid") @@ -192,14 +191,6 @@ namespace mongodbembed while (*end && *end != '}') end++; // Get out of both nested documents end++; - - while (*end && *end != '}') - end++; - end++; - - depth--; - row = end; // Set row to just after the nested document - start = end; // move start to the next place for parsing } else { @@ -208,13 +199,6 @@ namespace mongodbembed end++; result += std::string(start, ++end - start); // Only add the data inside the quotation marks to result string - - while (*end && *end != '}') - end++; // Only have to get out of one nested document - end++; - depth--; - row = end; // Set row to just after the nested document - start = end; // move start to the next place for parsing } } else if (key == "$numberDouble" || key == "$numberDecimal" || key == "$numberLong") @@ -229,17 +213,23 @@ namespace mongodbembed end++; result += std::string(start, end++ - start); // Only add the data inside the quotation marks to result string - while (*end && *end != '}') - end++; // Only have to get out of one nested document - end++; - depth--; - row = end; - start = end; } else { failx("EJSON datatype error: '%s' is not supported in the current version.", key.c_str()); } + + // Get out of nested object. + while (*end && *end != '}') + end++; + + if (*end) + end++; + else + failx("Read past the end of stream while converting EJSON types to ECL."); + depth--; + row = end; // Set row to just after the nested document + start = end; // move start to the next place for parsing } /** From 09cbe7724e2dd6845086232edc5426851bc81e1a Mon Sep 17 00:00:00 2001 From: Gavin Halliday Date: Wed, 20 Mar 2024 14:46:18 +0000 Subject: [PATCH 22/44] HPCC-31505 Add regression test for index read with continuation Signed-off-by: Gavin Halliday --- testing/regress/ecl/indexmerge.ecl | 40 ++++++++++++++++++++++++++ testing/regress/ecl/key/indexmerge.xml | 3 ++ 2 files changed, 43 insertions(+) create mode 100644 testing/regress/ecl/indexmerge.ecl create mode 100644 testing/regress/ecl/key/indexmerge.xml diff --git a/testing/regress/ecl/indexmerge.ecl b/testing/regress/ecl/indexmerge.ecl new file mode 100644 index 00000000000..e089e4c95a5 --- /dev/null +++ b/testing/regress/ecl/indexmerge.ecl @@ -0,0 +1,40 @@ +/*############################################################################## + + HPCC SYSTEMS software Copyright (C) 2024 HPCC Systems®. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +############################################################################## */ + +//class=file +//class=index +//version multiPart=false +//version multiPart=true + +import ^ as root; +multiPart := #IFDEFINED(root.multiPart, true); +useLocal := #IFDEFINED(root.useLocal, false); +useTranslation := #IFDEFINED(root.useTranslation, false); + +//--- end of version configuration --- + +import $.setup; +import setup.TS; +Files := setup.Files(multiPart, useLocal, useTranslation); + +//Read from an index, merging from a large number of cursor positions to generate a sorted output + +TS_searchIndex := Files.getSearchIndex(); +filtered := TS_searchIndex(KEYED(kind=1 AND word[1]='a')); +withOrder := STEPPED(filtered, doc, PRIORITY(3),HINT(maxseeklookahead(50))); + +OUTPUT(COUNT(NOFOLD(withOrder)) = 305475); diff --git a/testing/regress/ecl/key/indexmerge.xml b/testing/regress/ecl/key/indexmerge.xml new file mode 100644 index 00000000000..44a8709ad35 --- /dev/null +++ b/testing/regress/ecl/key/indexmerge.xml @@ -0,0 +1,3 @@ + + true + From 6d60ad3284f49efdd80da507c721b450f09b115e Mon Sep 17 00:00:00 2001 From: M Kelly Date: Mon, 22 Apr 2024 15:55:11 -0400 Subject: [PATCH 23/44] HPCC-31395 Roxie use a valid port for cascade Signed-off-by: M Kelly --- roxie/ccd/ccdmain.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/roxie/ccd/ccdmain.cpp b/roxie/ccd/ccdmain.cpp index 5490b81b7fe..cb12d56df0e 100644 --- a/roxie/ccd/ccdmain.cpp +++ b/roxie/ccd/ccdmain.cpp @@ -1537,22 +1537,29 @@ int CCD_API roxie_main(int argc, const char *argv[], const char * defaultYaml) if (!numThreads) numThreads = numServerThreads; unsigned port = roxieFarm.getPropInt("@port", roxieFarm.getPropInt("@servicePort", ROXIE_SERVER_PORT)); + const char *protocol = roxieFarm.queryProp("@protocol"); + bool serviceTLS = roxieFarm.getPropBool("@tls") || (protocol && streq(protocol, "ssl")); //unsigned requestArrayThreads = roxieFarm.getPropInt("@requestArrayThreads", 5); // NOTE: farmer name [@name=] is not copied into topology const IpAddress ip = myNode.getIpAddress(); if (!roxiePort) { roxiePort = port; - if (roxieFarm.getPropBool("@tls")) - roxiePortTlsClientConfig = createIssuerTlsConfig(roxieFarm.queryProp("@issuer"), nullptr, true, roxieFarm.getPropBool("@selfSigned"), true, false); + if (serviceTLS) + { +#ifdef _USE_OPENSSL + const char *certIssuer = roxieFarm.queryProp("@issuer"); + if (isEmptyString(certIssuer)) + certIssuer = roxieFarm.getPropBool("@public", true) ? "public" : "local"; + roxiePortTlsClientConfig = createIssuerTlsConfig(certIssuer, nullptr, true, roxieFarm.getPropBool("@selfSigned"), true, false); +#endif + } debugEndpoint.set(roxiePort, ip); } bool suspended = roxieFarm.getPropBool("@suspended", false); Owned roxieServer; if (port) { - const char *protocol = roxieFarm.queryProp("@protocol"); - bool serviceTLS = roxieFarm.getPropBool("@tls") || (protocol && streq(protocol, "ssl")); StringBuffer certFileName; StringBuffer keyFileName; StringBuffer passPhraseStr; From 2ef1e54f0ad4bb15956672c46f54e54e779eb865 Mon Sep 17 00:00:00 2001 From: Gordon Smith Date: Tue, 23 Apr 2024 11:21:56 +0100 Subject: [PATCH 24/44] HPCC-31664 ECLWatch alpha-numeric sort issue Update alpha numeric sort algorithm. Default regular sort to be case insensitive. Signed-off-by: Gordon Smith --- esp/src/src-react/components/Helpers.tsx | 2 +- esp/src/src-react/components/InfoGrid.tsx | 21 +- esp/src/src-react/components/Resources.tsx | 2 +- esp/src/src-react/components/SourceFiles.tsx | 2 +- esp/src/src-react/components/Variables.tsx | 2 +- esp/src/src/Utility.ts | 279 ++++++++++++------- esp/src/src/store/util/SimpleQueryEngine.ts | 5 +- 7 files changed, 198 insertions(+), 115 deletions(-) diff --git a/esp/src/src-react/components/Helpers.tsx b/esp/src/src-react/components/Helpers.tsx index 7e391bc9223..458308debd8 100644 --- a/esp/src/src-react/components/Helpers.tsx +++ b/esp/src/src-react/components/Helpers.tsx @@ -230,7 +230,7 @@ export const Helpers: React.FunctionComponent = ({ = ({ const columns = React.useMemo((): FluentColumns => { return { Severity: { - label: nlsHPCC.Severity, field: "", width: 72, sortable: false, + label: nlsHPCC.Severity, width: 72, sortable: false, className: (value, row) => { switch (value) { case "Error": @@ -79,8 +79,8 @@ export const InfoGrid: React.FunctionComponent = ({ return ""; } }, - Source: { - label: `${nlsHPCC.Source} / ${nlsHPCC.Cost}`, field: "", width: 144, sortable: false, + Priority: { + label: `${nlsHPCC.Source} / ${nlsHPCC.Cost}`, width: 144, formatter: (Source, row) => { if (Source === "Cost Optimizer") { return formatCost(+row.Priority); @@ -88,10 +88,10 @@ export const InfoGrid: React.FunctionComponent = ({ return Source; } }, - Code: { label: nlsHPCC.Code, field: "", width: 45, sortable: false }, + Code: { label: nlsHPCC.Code, width: 45 }, Message: { - label: nlsHPCC.Message, field: "", - sortable: false, + label: nlsHPCC.Message, + sortable: true, formatter: (Message, idx) => { const info = extractGraphInfo(Message); if (info.graphID && info.subgraphID) { @@ -104,15 +104,15 @@ export const InfoGrid: React.FunctionComponent = ({ return Message; } }, - Column: { label: nlsHPCC.Col, field: "", width: 36, sortable: false }, - LineNo: { label: nlsHPCC.Line, field: "", width: 36, sortable: false }, + Column: { label: nlsHPCC.Col, width: 36 }, + LineNo: { label: nlsHPCC.Line, width: 36 }, Activity: { - label: nlsHPCC.Activity, field: "", width: 56, sortable: false, + label: nlsHPCC.Activity, width: 56, formatter: (activityId, row) => { return activityId ? a{activityId} : ""; } }, - FileName: { label: nlsHPCC.FileName, field: "", width: 360, sortable: false } + FileName: { label: nlsHPCC.FileName, width: 360 } }; }, [wuid]); @@ -209,7 +209,6 @@ export const InfoGrid: React.FunctionComponent = ({ = ({ = ({ = ({ = 48 && i <= 57)); - if (m !== n) { - tz[++y] = ""; - n = m; +function isSign(code: number) { + return code === minus || code === plus; +} + +function compare(a, b, opts: { sign: boolean }) { + const checkSign = opts.sign; + let ia = 0; + let ib = 0; + const ma = a.length; + const mb = b.length; + let ca, cb; // character code + let za, zb; // leading zero count + let na, nb; // number length + let sa, sb; // number sign + let ta, tb; // temporary + let bias; + + while (ia < ma && ib < mb) { + ca = a.charCodeAt(ia); + cb = b.charCodeAt(ib); + za = zb = 0; + na = nb = 0; + sa = sb = true; + bias = 0; + + // skip over leading spaces + while (isWhitespace(ca)) { + ia += 1; + ca = a.charCodeAt(ia); + } + while (isWhitespace(cb)) { + ib += 1; + cb = b.charCodeAt(ib); + } + + // skip and save sign + if (checkSign) { + ta = a.charCodeAt(ia + 1); + if (isSign(ca) && isDigit(ta)) { + if (ca === minus) { + sa = false; + } + ia += 1; + ca = ta; + } + tb = b.charCodeAt(ib + 1); + if (isSign(cb) && isDigit(tb)) { + if (cb === minus) { + sb = false; + } + ib += 1; + cb = tb; } - tz[y] += j; } - return tz; - } - const aa = chunkify(a); - const bb = chunkify(b); - - for (let x = 0; aa[x] && bb[x]; x++) { - if (aa[x] !== bb[x]) { - const c = Number(aa[x]); - const d = Number(bb[x]); - // tslint:disable-next-line: triple-equals - if (c == aa[x] && d == bb[x]) { - return c - d; - } else return (aa[x] > bb[x]) ? 1 : -1; + // compare digits with other symbols + if (isDigit(ca) && !isDigit(cb)) { + return -1; + } + if (!isDigit(ca) && isDigit(cb)) { + return 1; + } + + // compare negative and positive + if (!sa && sb) { + return -1; + } + if (sa && !sb) { + return 1; } - } - return aa.length - bb.length; -} -/* ******************************************************************** - * Alphanum sort() function version - case insensitive - * - Slower, but easier to modify for arrays of objects which contain - * string properties - * - */ -export function alphanumCase(a, b) { - function chunkify(t) { - const tz = []; - let x = 0; - let y = -1; - let n = false; - let i; - let j; - - // eslint-disable-next-line no-cond-assign - while (i = (j = t.charAt(x++)).charCodeAt(0)) { - // tslint:disable-next-line: triple-equals - const m = (i == 46 || (i >= 48 && i <= 57)); // jshint ignore:line - if (m !== n) { - tz[++y] = ""; - n = m; + // count leading zeros + while (ca === zero) { + za += 1; + ia += 1; + ca = a.charCodeAt(ia); + } + while (cb === zero) { + zb += 1; + ib += 1; + cb = b.charCodeAt(ib); + } + + // count numbers + while (isDigit(ca) || isDigit(cb)) { + if (isDigit(ca) && isDigit(cb) && bias === 0) { + if (sa) { + if (ca < cb) { + bias = -1; + } else if (ca > cb) { + bias = 1; + } + } else { + if (ca > cb) { + bias = -1; + } else if (ca < cb) { + bias = 1; + } + } + } + if (isDigit(ca)) { + ia += 1; + na += 1; + ca = a.charCodeAt(ia); + } + if (isDigit(cb)) { + ib += 1; + nb += 1; + cb = b.charCodeAt(ib); } - tz[y] += j; } - return tz; - } - const aa = chunkify(a.toLowerCase()); - const bb = chunkify(b.toLowerCase()); - - for (let x = 0; aa[x] && bb[x]; x++) { - if (aa[x] !== bb[x]) { - const c = Number(aa[x]); - const d = Number(bb[x]); - // tslint:disable-next-line: triple-equals - if (c == aa[x] && d == bb[x]) { // jshint ignore:line - return c - d; - } else return (aa[x] > bb[x]) ? 1 : -1; + // compare number length + if (sa) { + if (na < nb) { + return -1; + } + if (na > nb) { + return 1; + } + } else { + if (na > nb) { + return -1; + } + if (na < nb) { + return 1; + } + } + + // compare numbers + if (bias) { + return bias; + } + + // compare leading zeros + if (sa) { + if (za > zb) { + return -1; + } + if (za < zb) { + return 1; + } + } else { + if (za < zb) { + return -1; + } + if (za > zb) { + return 1; + } + } + + // compare ascii codes + if (ca < cb) { + return -1; + } + if (ca > cb) { + return 1; } + + ia += 1; + ib += 1; + } + + // compare length + if (ma < mb) { + return -1; } - return aa.length - bb.length; + if (ma > mb) { + return 1; + } + return 0; } +// ----------------------------------------------------------------------------------------------- export function onDomMutate(domNode, callback, observerOpts) { observerOpts = observerOpts || { attributes: true, attributeFilter: ["style"] }; @@ -458,8 +537,10 @@ export function onDomMutate(domNode, callback, observerOpts) { observer.observe(domNode, observerOpts); } -export function alphanumCompare(l, r, caseInsensitive: boolean = true, reverse: boolean = true): number { - const cmp = caseInsensitive ? alphanumCase(l, r) : alphanum(l, r); +export function alphanumCompare(_l, _r, caseInsensitive: boolean = true, reverse: boolean = true): number { + const l = caseInsensitive && typeof _l === "string" ? _l.toLocaleLowerCase() : _l; + const r = caseInsensitive && typeof _r === "string" ? _r.toLocaleLowerCase() : _r; + const cmp = compare(l, r, { sign: false }); if (cmp !== 0) { return cmp * (reverse ? -1 : 1); } diff --git a/esp/src/src/store/util/SimpleQueryEngine.ts b/esp/src/src/store/util/SimpleQueryEngine.ts index e7b8a9e9bc4..e9f74c8f863 100644 --- a/esp/src/src/store/util/SimpleQueryEngine.ts +++ b/esp/src/src/store/util/SimpleQueryEngine.ts @@ -2,7 +2,7 @@ import { alphanumCompare } from "../../Utility"; import { BaseRow, QueryOptions, QueryRequest, QuerySort } from "../Store"; function createSortFunc(sortSet: QuerySort, alphanumColumns: { [id: string]: boolean }) { - return typeof sortSet == "function" ? sortSet : function (a, b) { + return typeof sortSet == "function" ? sortSet : function (a: any, b: any) { for (let i = 0; sortSet[i]; i++) { const sort = sortSet[i]; if (alphanumColumns[sort.attribute as string]) { @@ -16,6 +16,9 @@ function createSortFunc(sortSet: QuerySort, alphanumColumn // valueOf enables proper comparison of dates aValue = aValue != null ? aValue.valueOf() : aValue; bValue = bValue != null ? bValue.valueOf() : bValue; + if (typeof aValue === "string" && typeof bValue === "string") { + return aValue.localeCompare(bValue, undefined, { sensitivity: "base" }) * (sort.descending ? -1 : 1); + } if (aValue != bValue) { return !!sort.descending == (aValue == null || aValue > bValue) ? -1 : 1; } From 71ad01105dbb2126ace374926ac671c8d2e47ff5 Mon Sep 17 00:00:00 2001 From: Jack Del Vecchio Date: Thu, 18 Apr 2024 16:23:04 +0000 Subject: [PATCH 25/44] HPCC-31642 ParquetReader::readColumns not reading nested columns properly --- common/thorhelper/thorread.cpp | 2 +- plugins/parquet/parquetembed.cpp | 83 +++++++++++++++++--------------- plugins/parquet/parquetembed.hpp | 5 +- 3 files changed, 46 insertions(+), 44 deletions(-) diff --git a/common/thorhelper/thorread.cpp b/common/thorhelper/thorread.cpp index d1dd5169a69..ab7386a7719 100644 --- a/common/thorhelper/thorread.cpp +++ b/common/thorhelper/thorread.cpp @@ -1767,7 +1767,7 @@ bool ParquetDiskRowReader::matches(const char * _format, bool _streamRemote, IDi bool ParquetDiskRowReader::setInputFile(const char * localFilename, const char * logicalFilename, unsigned partNumber, offset_t baseOffset, const IPropertyTree * inputOptions, const FieldFilterArray & expectedFilter) { DBGLOG(0, "Opening File: %s", localFilename); - parquetFileReader = new parquetembed::ParquetReader("read", localFilename, 50000, nullptr, parquetActivityCtx, &mapping->queryExpectedMeta()->queryRecordAccessor(true)); + parquetFileReader = new parquetembed::ParquetReader("read", localFilename, 50000, nullptr, parquetActivityCtx, mapping->queryExpectedMeta()->queryTypeInfo()); auto st = parquetFileReader->processReadFile(); if (!st.ok()) throw MakeStringException(0, "%s: %s.", st.CodeAsString().c_str(), st.message().c_str()); diff --git a/plugins/parquet/parquetembed.cpp b/plugins/parquet/parquetembed.cpp index e247c3fb07c..e8e91fdbed9 100644 --- a/plugins/parquet/parquetembed.cpp +++ b/plugins/parquet/parquetembed.cpp @@ -95,6 +95,42 @@ extern void fail(const char *message) rtlFail(0, msg.str()); } +/** + * @brief Utility function for getting the xpath or field name from an RtlFieldInfo object. + * + * @param outXPath The buffer for storing output. + * @param field RtlFieldInfo object storing metadata for field. + */ +void xpathOrName(StringBuffer &outXPath, const RtlFieldInfo *field) +{ + outXPath.clear(); + + if (field->xpath) + { + if (field->xpath[0] == xpathCompoundSeparatorChar) + { + outXPath.append(field->xpath + 1); + } + else + { + const char *sep = strchr(field->xpath, xpathCompoundSeparatorChar); + + if (!sep) + { + outXPath.append(field->xpath); + } + else + { + outXPath.append(field->xpath, 0, static_cast(sep - field->xpath)); + } + } + } + else + { + outXPath.append(field->name); + } +} + /** * @brief Contructs a ParquetReader for a specific file location. * @@ -107,7 +143,7 @@ ParquetReader::ParquetReader(const char *option, const char *_location, int _max : ParquetReader(option, _location, _maxRowCountInTable, _partitionFields, _activityCtx, nullptr) {} // Constructs a ParquetReader with the expected record layout of the Parquet file -ParquetReader::ParquetReader(const char *option, const char *_location, int _maxRowCountInTable, const char *_partitionFields, const IThorActivityContext *_activityCtx, const RtlRecord *_expectedRecord) +ParquetReader::ParquetReader(const char *option, const char *_location, int _maxRowCountInTable, const char *_partitionFields, const IThorActivityContext *_activityCtx, const RtlTypeInfo * _expectedRecord) : partOption(option), location(_location), expectedRecord(_expectedRecord) { maxRowCountInTable = _maxRowCountInTable; @@ -274,14 +310,17 @@ void divide_row_groups(const IThorActivityContext *activityCtx, __int64 totalRow __int64 ParquetReader::readColumns(__int64 currTable) { auto rowGroupReader = queryCurrentTable(currTable); // Sets currentTableMetadata - for (int i = 0; i < expectedRecord->getNumFields(); i++) + int numFields = getNumFields(expectedRecord); + for (int i = 0; i < numFields; i++) { - int columnIndex = currentTableMetadata->schema()->ColumnIndex(expectedRecord->queryName(i)); + StringBuffer fieldName; + xpathOrName(fieldName, expectedRecord->queryFields()[i]); + int columnIndex = currentTableMetadata->schema()->group_node()->FieldIndex(fieldName.str()); if (columnIndex >= 0) { std::shared_ptr column; reportIfFailure(rowGroupReader->Column(columnIndex)->Read(&column)); - parquetTable.insert(std::make_pair(expectedRecord->queryName(i), column->chunk(0))); + parquetTable.insert(std::make_pair(fieldName.str(), column->chunk(0))); } } @@ -1013,42 +1052,6 @@ void ParquetRowStream::stop() shouldRead = false; } -/** - * @brief Utility function for getting the xpath or field name from an RtlFieldInfo object. - * - * @param outXPath The buffer for storing output. - * @param field RtlFieldInfo object storing metadata for field. - */ -void ParquetRowBuilder::xpathOrName(StringBuffer &outXPath, const RtlFieldInfo *field) const -{ - outXPath.clear(); - - if (field->xpath) - { - if (field->xpath[0] == xpathCompoundSeparatorChar) - { - outXPath.append(field->xpath + 1); - } - else - { - const char *sep = strchr(field->xpath, xpathCompoundSeparatorChar); - - if (!sep) - { - outXPath.append(field->xpath); - } - else - { - outXPath.append(field->xpath, 0, static_cast(sep - field->xpath)); - } - } - } - else - { - outXPath.append(field->name); - } -} - /** * @brief Gets the current array index taking into account the nested status of the row. * diff --git a/plugins/parquet/parquetembed.hpp b/plugins/parquet/parquetembed.hpp index 39a3e3c5aef..277c5385c26 100644 --- a/plugins/parquet/parquetembed.hpp +++ b/plugins/parquet/parquetembed.hpp @@ -361,7 +361,7 @@ class PARQUETEMBED_PLUGIN_API ParquetReader { public: ParquetReader(const char *option, const char *_location, int _maxRowCountInTable, const char *_partitionFields, const IThorActivityContext *_activityCtx); - ParquetReader(const char *option, const char *_location, int _maxRowCountInTable, const char *_partitionFields, const IThorActivityContext *_activityCtx, const RtlRecord *_expectedRecord); + ParquetReader(const char *option, const char *_location, int _maxRowCountInTable, const char *_partitionFields, const IThorActivityContext *_activityCtx, const RtlTypeInfo *_expectedRecord); ~ParquetReader(); arrow::Status processReadFile(); @@ -397,7 +397,7 @@ class PARQUETEMBED_PLUGIN_API ParquetReader size_t maxRowCountInTable = 0; // Max table size set by user. std::string partOption; // Begins with either read or write and ends with the partitioning type if there is one i.e. 'readhivepartition'. std::string location; // Full path to location for reading parquet files. Can be a filename or directory. - const RtlRecord *expectedRecord = nullptr; // Expected record layout of Parquet file. Only available when used in the platform i.e. not available when used as a plugin. + const RtlTypeInfo * expectedRecord = nullptr; // Expected record layout of Parquet file. Only available when used in the platform i.e. not available when used as a plugin. const IThorActivityContext *activityCtx = nullptr; // Context about the thor worker configuration. std::shared_ptr scanner = nullptr; // Scanner for reading through partitioned files. std::shared_ptr rbatchReader = nullptr; // RecordBatchReader reads a dataset one record batch at a time. Must be kept alive for rbatchItr. @@ -513,7 +513,6 @@ class PARQUETEMBED_PLUGIN_API ParquetRowBuilder : public CInterfaceOf Date: Tue, 16 Apr 2024 14:08:34 +0100 Subject: [PATCH 26/44] HPCC-31616 Record WhenStarted for dfu file operations Signed-off-by: Shamser Ahmed --- esp/services/ws_fs/ws_fsService.cpp | 16 +++++----------- plugins/fileservices/fileservices.cpp | 26 ++++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/esp/services/ws_fs/ws_fsService.cpp b/esp/services/ws_fs/ws_fsService.cpp index 4a83c2cc65c..4a4fe36c8cc 100644 --- a/esp/services/ws_fs/ws_fsService.cpp +++ b/esp/services/ws_fs/ws_fsService.cpp @@ -331,19 +331,13 @@ static void DeepAssign(IEspContext &context, IConstDFUWorkUnit *src, IEspDFUWork dest.setStateMessage(statemsg.str()); CDateTime startAt; - CDateTime stoppAt; + CDateTime stopAt; prog->getTimeStarted(startAt); - prog->getTimeStopped(stoppAt); + prog->getTimeStopped(stopAt); + StringBuffer tmpstr; - startAt.getDateString(tmpstr); - tmpstr.append(" "); - startAt.getTimeString(tmpstr); - dest.setTimeStarted(tmpstr.str()); - tmpstr.clear(); - stoppAt.getDateString(tmpstr); - tmpstr.append(" "); - stoppAt.getTimeString(tmpstr); - dest.setTimeStopped(tmpstr.str()); + dest.setTimeStarted(startAt.getString(tmpstr).str()); + dest.setTimeStopped(stopAt.getString(tmpstr.clear()).str()); StringBuffer prgmsg; prog->formatProgressMessage(prgmsg); diff --git a/plugins/fileservices/fileservices.cpp b/plugins/fileservices/fileservices.cpp index f5e53b786d2..865abfd1b01 100644 --- a/plugins/fileservices/fileservices.cpp +++ b/plugins/fileservices/fileservices.cpp @@ -611,7 +611,7 @@ static void blockUntilComplete(const char * label, IClientFileSpray &server, ICo VStringBuffer reason("Blocked by fileservice activity: %s, workunit: %s", label, wuid); setWorkunitState(ctx, WUStateBlocked, reason.str()); - + bool isStartTimeRecorded = false; while(true) { @@ -630,6 +630,7 @@ static void blockUntilComplete(const char * label, IClientFileSpray &server, ICo } IConstDFUWorkunit & dfuwu = result->getResult(); + DFUstate state = (DFUstate)dfuwu.getState(); bool aborting = false; Owned wu = ctx->updateWorkUnit(); // may return NULL if (wu.get()) { // if updatable (e.g. not hthor with no agent context) @@ -645,11 +646,32 @@ static void blockUntilComplete(const char * label, IClientFileSpray &server, ICo stat_type costFileAccess = money2cost_type(dfuwu.getFileAccessCost()); updateWorkunitStat(wu, SSTdfuworkunit, wuScope, StCostFileAccess, "", costFileAccess); wu->setApplicationValue(label, dfuwu.getID(), dfuwu.getSummaryMessage(), true); + if (!isStartTimeRecorded) + { + switch (state) + { + case DFUstate_started: + case DFUstate_aborting: + case DFUstate_monitoring: + case DFUstate_aborted: + case DFUstate_failed: + case DFUstate_finished: + + const char * whenStarted = dfuwu.getTimeStarted(); + if (!isEmptyString(whenStarted)) + { + CDateTime startedAt; + startedAt.setString(whenStarted); + updateWorkunitStat(wu, SSTdfuworkunit, wuScope, StWhenStarted, 0, startedAt.getTimeStamp()); + isStartTimeRecorded = true; + } + break; + } + } wu->commit(); wu.clear(); } - DFUstate state = (DFUstate)dfuwu.getState(); if (stateout) stateout->clear().append(dfuwu.getStateMessage()); switch(state) From c0a47239d1ea09b808c314e384d8bec534e168d1 Mon Sep 17 00:00:00 2001 From: Gavin Halliday Date: Tue, 23 Apr 2024 15:26:40 +0100 Subject: [PATCH 27/44] HPCC-31670 Avoid file rename when copying c++ files in containerized systems Signed-off-by: Gavin Halliday --- common/workunit/workunit.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/workunit/workunit.cpp b/common/workunit/workunit.cpp index 712e368e127..a1ec406b666 100644 --- a/common/workunit/workunit.cpp +++ b/common/workunit/workunit.cpp @@ -13909,7 +13909,7 @@ extern WORKUNIT_API void associateLocalFile(IWUQuery * query, WUFileType type, c OwnedIFile target = createIFile(destPathName); if (!target->exists()) { - source->copyTo(target, 0, NULL, true); + source->copyTo(target, 0, NULL, false); } query->addAssociatedFile(type, destPathName, "localhost", description, crc, minActivity, maxActivity); // Should we delete the local files? No - they may not be finished with From 0e52e6e59da39e1b33123575065e40c5ce241f6e Mon Sep 17 00:00:00 2001 From: Jack Del Vecchio Date: Thu, 18 Apr 2024 12:14:36 +0000 Subject: [PATCH 28/44] HPCC-31615 Coverity scan for parquetembed.hpp --- plugins/parquet/parquetembed.cpp | 4 ++-- plugins/parquet/parquetembed.hpp | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/plugins/parquet/parquetembed.cpp b/plugins/parquet/parquetembed.cpp index e247c3fb07c..54baa7ebce8 100644 --- a/plugins/parquet/parquetembed.cpp +++ b/plugins/parquet/parquetembed.cpp @@ -814,7 +814,7 @@ void ParquetWriter::beginSet(const char *fieldName) } arrow::ArrayBuilder *childBuilder; arrow::FieldPath match = getNestedFieldBuilder(fieldName, childBuilder); - fieldBuilderStack.push_back(std::make_shared(fieldName, childBuilder, CPNTSet, match)); + fieldBuilderStack.push_back(std::make_shared(fieldName, childBuilder, CPNTSet, std::move(match))); arrow::ListBuilder *listBuilder = static_cast(childBuilder); reportIfFailure(listBuilder->Append()); @@ -833,7 +833,7 @@ void ParquetWriter::beginRow(const char *fieldName) { arrow::ArrayBuilder *childBuilder; arrow::FieldPath match = getNestedFieldBuilder(fieldName, childBuilder); - fieldBuilderStack.push_back(std::make_shared(fieldName, childBuilder, CPNTDataset, match)); + fieldBuilderStack.push_back(std::make_shared(fieldName, childBuilder, CPNTDataset, std::move(match))); arrow::StructBuilder *structBuilder = static_cast(childBuilder); reportIfFailure(structBuilder->Append()); diff --git a/plugins/parquet/parquetembed.hpp b/plugins/parquet/parquetembed.hpp index 39a3e3c5aef..c5a35ae4080 100644 --- a/plugins/parquet/parquetembed.hpp +++ b/plugins/parquet/parquetembed.hpp @@ -107,8 +107,12 @@ struct ArrayBuilderTracker unsigned int childCount = 0; unsigned int childrenProcessed = 0; - ArrayBuilderTracker(const char *_nodeName, arrow::ArrayBuilder *_struct, PathNodeType _nodeType, arrow::FieldPath _nodePath) - : nodeName(_nodeName), nodeType(_nodeType), structPtr(_struct), nodePath(_nodePath) { if (nodeType == CPNTDataset) childCount == structPtr->num_children(); } + ArrayBuilderTracker(const char *_nodeName, arrow::ArrayBuilder *_struct, PathNodeType _nodeType, arrow::FieldPath && _nodePath) + : nodeName(_nodeName), nodeType(_nodeType), structPtr(_struct), nodePath(std::move(_nodePath)) + { + if (nodeType == CPNTDataset) + childCount = structPtr->num_children(); + } bool finishedChildren() { return childrenProcessed < childCount; } }; From 6945d5f96f81d1ab6de650a3fb742e9e0b03da39 Mon Sep 17 00:00:00 2001 From: xwang2713 Date: Tue, 16 Apr 2024 16:36:22 +0100 Subject: [PATCH 29/44] HPCC-31335 update build-assets.yml for Rocky Linux 8 support Signed-off-by: Gordon Smith --- .github/workflows/build-assets.yml | 5 +++++ cmake_modules/distrocheck.sh | 8 ++++++++ cmake_modules/getpackagerevisionarch.sh | 9 ++++++++- dockerfiles/vcpkg/rockylinux-8.dockerfile | 4 ++++ 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-assets.yml b/.github/workflows/build-assets.yml index c761ec0cb51..2bf3aa3e723 100644 --- a/.github/workflows/build-assets.yml +++ b/.github/workflows/build-assets.yml @@ -107,6 +107,7 @@ jobs: cmake_options_extra: "-DVCPKG_TARGET_TRIPLET=x64-centos-7-dynamic" - os: amazonlinux cmake_options_extra: "-DVCPKG_TARGET_TRIPLET=x64-amazonlinux-dynamic" + - os: rockylinux-8 - os: ubuntu-22.04 name: LN k8s ln: true @@ -128,6 +129,10 @@ jobs: name: LN cmake_options_extra: "-DVCPKG_TARGET_TRIPLET=x64-centos-7-dynamic" ln: true + - os: rockylinux-8 + name: LN + cmake_options_extra: "" + ln: true - os: centos-7-rh-python38 name: LN Python 3.8 cmake_options_extra: "-DVCPKG_TARGET_TRIPLET=x64-centos-7-dynamic -DCUSTOM_LABEL=_rh_python38" diff --git a/cmake_modules/distrocheck.sh b/cmake_modules/distrocheck.sh index 8ab1807f561..e9cbad62edf 100755 --- a/cmake_modules/distrocheck.sh +++ b/cmake_modules/distrocheck.sh @@ -70,6 +70,14 @@ if [ $VALUE -ge 1 ]; then exit 1; fi +# Distribution is Rocky +VALUE=`grep -c -i 'rocky' temp.txt` +if [ $VALUE -ge 1 ]; then + echo -n "RPM" + rm temp.txt + exit 1; +fi + ############### DEB DISTROS ################## # Distribution is Ubuntu diff --git a/cmake_modules/getpackagerevisionarch.sh b/cmake_modules/getpackagerevisionarch.sh index 63e378246b9..2dad702e18f 100755 --- a/cmake_modules/getpackagerevisionarch.sh +++ b/cmake_modules/getpackagerevisionarch.sh @@ -85,7 +85,7 @@ elif [ -e /etc/redhat-release ]; then OS_GROUP=`/bin/rpm -q --qf "%{NAME}" --whatprovides /etc/redhat-release | sed 's/-release.*//' | tr '[A-Z]' '[a-z]'` REDHAT_VERSION=`/bin/rpm -q --qf "%{VERSION}" --whatprovides /etc/redhat-release | cut -f1 -d"."` case "$OS_GROUP" in - "centos"* | "fedora" | "rocky") + "centos"* | "fedora") if [ ${NOARCH} -eq 0 ]; then OUTPUT="el${REDHAT_VERSION}.${ARCH}" else @@ -100,6 +100,13 @@ elif [ -e /etc/redhat-release ]; then OUTPUT="el${REDHAT_VERSION}" fi ;; + "rocky") + if [ ${NOARCH} -eq 0 ]; then + OUTPUT="rocky${REDHAT_VERSION}.${ARCH}" + else + OUTPUT="rocky${REDHAT_VERSION}" + fi + ;; esac fi elif [ -e /etc/SuSE-release ]; then diff --git a/dockerfiles/vcpkg/rockylinux-8.dockerfile b/dockerfiles/vcpkg/rockylinux-8.dockerfile index 3ba849a08dc..17c76d889b3 100644 --- a/dockerfiles/vcpkg/rockylinux-8.dockerfile +++ b/dockerfiles/vcpkg/rockylinux-8.dockerfile @@ -3,4 +3,8 @@ FROM hpccsystems/platform-build-base-rockylinux-8:$VCPKG_REF ENTRYPOINT ["/bin/bash", "--login", "-c"] +RUN yum install -y \ + rpm-build && \ + yum -y clean all && rm -rf /var/cache + CMD ["/bin/bash"] From 09aaf7d0fb18abf40bd994c15aab0f1697373dc4 Mon Sep 17 00:00:00 2001 From: Attila Vamos Date: Tue, 23 Apr 2024 17:15:40 +0100 Subject: [PATCH 30/44] HPCC-30141 Regression test engine fails with some version strings - Fix the problem caused ':', '.' and '/' characters in the version value. Tested manually. Signed-off-by: Attila Vamos --- testing/regress/hpcc/util/ecl/file.py | 5 ++++- testing/regress/hpcc/util/util.py | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/testing/regress/hpcc/util/ecl/file.py b/testing/regress/hpcc/util/ecl/file.py index 9c5da6897f3..25eced0c77a 100644 --- a/testing/regress/hpcc/util/ecl/file.py +++ b/testing/regress/hpcc/util/ecl/file.py @@ -566,7 +566,10 @@ def setJobnameVersion(self, version): # 'multiPart=false,useSequential=true' # to this # 'multiPart(false)-useSequential(true)' - self.jobnameVersion += '-' +version.replace('=', '(').replace(',', ')-')+')' + # need to handle this kind of value as well: + # url='http://.:9876' + # where the ':', '.' and '/' can cause problem later in version result check + self.jobnameVersion += '-' +version.replace('=', '(').replace(',', ')-').replace('.','-dot-').replace(':','-colon-').replace('/','-slash-').replace('?','-qmark-').replace('*','-star-')+')' pass def setJobname(self, timestamp): diff --git a/testing/regress/hpcc/util/util.py b/testing/regress/hpcc/util/util.py index 6dd9a9432e6..814cda4c561 100644 --- a/testing/regress/hpcc/util/util.py +++ b/testing/regress/hpcc/util/util.py @@ -142,7 +142,8 @@ def queryWuid(jobname, taskId): result = 'OK' for resultItem in resultItems: resultItem = resultItem.strip() - [key, val] = resultItem.split(':') + logger.debug("%3d. resultItem: '%s'", taskId, resultItem) + [key, val] = resultItem.split(':', 1) if key == 'ID': wuid = val if key == 'state': From a4f941d5bf090672de7a21ac17847096a254bc65 Mon Sep 17 00:00:00 2001 From: Jack Del Vecchio Date: Tue, 23 Apr 2024 18:55:01 +0000 Subject: [PATCH 31/44] HPCC-30681 Coverity scan unreachable code in Parquet plugin --- plugins/parquet/parquetembed.cpp | 9 --------- 1 file changed, 9 deletions(-) diff --git a/plugins/parquet/parquetembed.cpp b/plugins/parquet/parquetembed.cpp index e247c3fb07c..6a6ad2994cc 100644 --- a/plugins/parquet/parquetembed.cpp +++ b/plugins/parquet/parquetembed.cpp @@ -1961,7 +1961,6 @@ ParquetEmbedFunctionContext::ParquetEmbedFunctionContext(const IContextLogger &_ bool ParquetEmbedFunctionContext::getBooleanResult() { UNIMPLEMENTED_X("Parquet Scalar Return Type BOOLEAN"); - return false; } void ParquetEmbedFunctionContext::getDataResult(size32_t &len, void *&result) @@ -1972,19 +1971,16 @@ void ParquetEmbedFunctionContext::getDataResult(size32_t &len, void *&result) double ParquetEmbedFunctionContext::getRealResult() { UNIMPLEMENTED_X("Parquet Scalar Return Type REAL"); - return 0.0; } __int64 ParquetEmbedFunctionContext::getSignedResult() { UNIMPLEMENTED_X("Parquet Scalar Return Type SIGNED"); - return 0; } unsigned __int64 ParquetEmbedFunctionContext::getUnsignedResult() { UNIMPLEMENTED_X("Parquet Scalar Return Type UNSIGNED"); - return 0; } void ParquetEmbedFunctionContext::getStringResult(size32_t &chars, char *&result) @@ -2036,7 +2032,6 @@ byte *ParquetEmbedFunctionContext::getRowResult(IEngineRowAllocator *_resultAllo size32_t ParquetEmbedFunctionContext::getTransformResult(ARowBuilder &rowBuilder) { UNIMPLEMENTED_X("Parquet Transform Result"); - return 0; } /** @@ -2229,10 +2224,7 @@ class ParquetEmbedContext : public CInterfaceOf virtual IEmbedFunctionContext *createFunctionContextEx(ICodeContext *ctx, const IThorActivityContext *activityCtx, unsigned flags, const char *options) override { if (flags & EFimport) - { UNSUPPORTED("IMPORT"); - return nullptr; - } else return new ParquetEmbedFunctionContext(ctx ? ctx->queryContextLogger() : queryDummyContextLogger(), activityCtx, options, flags); } @@ -2240,7 +2232,6 @@ class ParquetEmbedContext : public CInterfaceOf virtual IEmbedServiceContext *createServiceContext(const char *service, unsigned flags, const char *options) override { throwUnexpected(); - return nullptr; } }; From e2d10feff6bad17d985bad2230a92e1938d95bb6 Mon Sep 17 00:00:00 2001 From: Jeremy Clements <79224539+jeclrsg@users.noreply.github.com> Date: Wed, 24 Apr 2024 10:48:59 -0400 Subject: [PATCH 32/44] HPCC-30578 ECL Watch v9 fix page count for unknown WU Results bumped the version of @hpcc-js/eclwatch that fixed the maximum page number when WU results count was unknown Signed-off-by: Jeremy Clements <79224539+jeclrsg@users.noreply.github.com> --- esp/src/package-lock.json | 412 ++++++++++++++++++++++++++++++++++---- esp/src/package.json | 2 +- 2 files changed, 372 insertions(+), 42 deletions(-) diff --git a/esp/src/package-lock.json b/esp/src/package-lock.json index b0b5b53a176..49af70f060a 100644 --- a/esp/src/package-lock.json +++ b/esp/src/package-lock.json @@ -20,7 +20,7 @@ "@hpcc-js/common": "2.71.15", "@hpcc-js/comms": "2.91.3", "@hpcc-js/dataflow": "8.1.6", - "@hpcc-js/eclwatch": "2.73.44", + "@hpcc-js/eclwatch": "2.74.2", "@hpcc-js/graph": "2.85.13", "@hpcc-js/html": "2.42.18", "@hpcc-js/layout": "2.49.20", @@ -1806,11 +1806,42 @@ } }, "node_modules/@hpcc-js/api": { - "version": "2.12.15", - "resolved": "https://registry.npmjs.org/@hpcc-js/api/-/api-2.12.15.tgz", - "integrity": "sha512-JW1UDMiBOuI5MhH4BEttwn5zZuPEyUGD1AcA8Bsjynz0is2nV7CNlEljIBIF3tj6v9bYelj2E/Yrzg83sT3f7w==", + "version": "2.12.16", + "resolved": "https://registry.npmjs.org/@hpcc-js/api/-/api-2.12.16.tgz", + "integrity": "sha512-lmRvwoAHWcrTSKEbe/SR0Y61p4j/+VRnu7CViBe5wQ2nCrK9yFTLZzDlmHhvMIDyVJj4khI4/4ZZCUI13zfuzA==", "dependencies": { - "@hpcc-js/common": "^2.71.15" + "@hpcc-js/common": "^2.71.16" + } + }, + "node_modules/@hpcc-js/api/node_modules/@hpcc-js/common": { + "version": "2.71.16", + "resolved": "https://registry.npmjs.org/@hpcc-js/common/-/common-2.71.16.tgz", + "integrity": "sha512-hz5i9zUXBJrXW5tl30XwgFXwJ2nipzLD9pXQrg1Rw8zfXkQ1Xax22RvGZdASAGPsmHxefyWTK7fpcJd+ipOGOg==", + "dependencies": { + "@hpcc-js/util": "^2.51.0", + "@types/d3-array": "1.2.12", + "@types/d3-brush": "1.1.8", + "@types/d3-collection": "1.0.13", + "@types/d3-color": "1.4.5", + "@types/d3-dispatch": "1.0.12", + "@types/d3-drag": "1.2.8", + "@types/d3-dsv": "1.2.8", + "@types/d3-ease": "1.0.13", + "@types/d3-format": "1.4.5", + "@types/d3-interpolate": "1.4.5", + "@types/d3-scale": "1.0.22", + "@types/d3-selection": "1.4.6", + "@types/d3-time-format": "2.3.4", + "@types/d3-transition": "1.3.5", + "@types/d3-zoom": "1.8.7" + } + }, + "node_modules/@hpcc-js/api/node_modules/@hpcc-js/util": { + "version": "2.51.0", + "resolved": "https://registry.npmjs.org/@hpcc-js/util/-/util-2.51.0.tgz", + "integrity": "sha512-xTcU3JhXA0OZQgu2LBLt7rh2O+107IILlEzUIBSS/rR/hVaVOKZK/Jtm5aMIevoAqD/XvKLf8RzurwCF7j/ccw==", + "dependencies": { + "tslib": "2.6.2" } }, "node_modules/@hpcc-js/chart": { @@ -1906,46 +1937,274 @@ } }, "node_modules/@hpcc-js/dgrid": { - "version": "2.32.16", - "resolved": "https://registry.npmjs.org/@hpcc-js/dgrid/-/dgrid-2.32.16.tgz", - "integrity": "sha512-uwbRDzC9ZZTC83Y22SnkRumVde3gFgu2xFZXRwhS4dJ8jngVcQ/6buwWy65BlCy3wSBFfKOx4TvvbAbGXIdBWw==", + "version": "2.32.19", + "resolved": "https://registry.npmjs.org/@hpcc-js/dgrid/-/dgrid-2.32.19.tgz", + "integrity": "sha512-nFKWjepBJIceN2sTMk8N283OFvU5zwfFAeGqBnT3iQRO2vQRaJzZt4G+9xtgVPbnyWuGiqHhIxYoGJLUOMpLbQ==", "dependencies": { - "@hpcc-js/common": "^2.71.15", + "@hpcc-js/common": "^2.71.16", "@hpcc-js/ddl-shim": "^2.20.6", - "@hpcc-js/dgrid-shim": "^2.24.8", - "@hpcc-js/util": "^2.50.6" + "@hpcc-js/dgrid-shim": "^2.24.10", + "@hpcc-js/util": "^2.51.0" } }, "node_modules/@hpcc-js/dgrid-shim": { - "version": "2.24.8", - "resolved": "https://registry.npmjs.org/@hpcc-js/dgrid-shim/-/dgrid-shim-2.24.8.tgz", - "integrity": "sha512-04+r+7Qa2LSc/aWx+d/QzdRoerPCIpiCXcrXPBf7tBHxOzU8gAIW0WU7wiilUmL2ZdHyLXQrzcT0gKVHkKlJaQ==" + "version": "2.24.10", + "resolved": "https://registry.npmjs.org/@hpcc-js/dgrid-shim/-/dgrid-shim-2.24.10.tgz", + "integrity": "sha512-4PD4GvKn2/HQvgzeP+Gd0Halj4KySk0QW1C7dqfyNWV8AUaseT9SSUvyu2ftGPUrzq65sJ0fSaq4zh3Js9dbaQ==" + }, + "node_modules/@hpcc-js/dgrid/node_modules/@hpcc-js/common": { + "version": "2.71.16", + "resolved": "https://registry.npmjs.org/@hpcc-js/common/-/common-2.71.16.tgz", + "integrity": "sha512-hz5i9zUXBJrXW5tl30XwgFXwJ2nipzLD9pXQrg1Rw8zfXkQ1Xax22RvGZdASAGPsmHxefyWTK7fpcJd+ipOGOg==", + "dependencies": { + "@hpcc-js/util": "^2.51.0", + "@types/d3-array": "1.2.12", + "@types/d3-brush": "1.1.8", + "@types/d3-collection": "1.0.13", + "@types/d3-color": "1.4.5", + "@types/d3-dispatch": "1.0.12", + "@types/d3-drag": "1.2.8", + "@types/d3-dsv": "1.2.8", + "@types/d3-ease": "1.0.13", + "@types/d3-format": "1.4.5", + "@types/d3-interpolate": "1.4.5", + "@types/d3-scale": "1.0.22", + "@types/d3-selection": "1.4.6", + "@types/d3-time-format": "2.3.4", + "@types/d3-transition": "1.3.5", + "@types/d3-zoom": "1.8.7" + } + }, + "node_modules/@hpcc-js/dgrid/node_modules/@hpcc-js/util": { + "version": "2.51.0", + "resolved": "https://registry.npmjs.org/@hpcc-js/util/-/util-2.51.0.tgz", + "integrity": "sha512-xTcU3JhXA0OZQgu2LBLt7rh2O+107IILlEzUIBSS/rR/hVaVOKZK/Jtm5aMIevoAqD/XvKLf8RzurwCF7j/ccw==", + "dependencies": { + "tslib": "2.6.2" + } }, "node_modules/@hpcc-js/dgrid2": { - "version": "2.3.17", - "resolved": "https://registry.npmjs.org/@hpcc-js/dgrid2/-/dgrid2-2.3.17.tgz", - "integrity": "sha512-k1PiXtx/BeCyW3wG6zf9VUv5v2IWa1uTbvdIHxXjlpsSQ+vtixPcRaaut/JvzwdXsKrlYxe0b9zW/7gEXBdwCw==", + "version": "2.3.18", + "resolved": "https://registry.npmjs.org/@hpcc-js/dgrid2/-/dgrid2-2.3.18.tgz", + "integrity": "sha512-7OtEREk9xJYfjDGGP9abSvQWQCDTgwYIx+OfXqFArb031FhTC1rWrkc5svySRb/0VVVAvsQFkHK435GaNy6PHQ==", "dependencies": { - "@hpcc-js/common": "^2.71.15", + "@hpcc-js/common": "^2.71.16", "@hpcc-js/preact-shim": "^2.16.10", - "@hpcc-js/util": "^2.50.6" + "@hpcc-js/util": "^2.51.0" + } + }, + "node_modules/@hpcc-js/dgrid2/node_modules/@hpcc-js/common": { + "version": "2.71.16", + "resolved": "https://registry.npmjs.org/@hpcc-js/common/-/common-2.71.16.tgz", + "integrity": "sha512-hz5i9zUXBJrXW5tl30XwgFXwJ2nipzLD9pXQrg1Rw8zfXkQ1Xax22RvGZdASAGPsmHxefyWTK7fpcJd+ipOGOg==", + "dependencies": { + "@hpcc-js/util": "^2.51.0", + "@types/d3-array": "1.2.12", + "@types/d3-brush": "1.1.8", + "@types/d3-collection": "1.0.13", + "@types/d3-color": "1.4.5", + "@types/d3-dispatch": "1.0.12", + "@types/d3-drag": "1.2.8", + "@types/d3-dsv": "1.2.8", + "@types/d3-ease": "1.0.13", + "@types/d3-format": "1.4.5", + "@types/d3-interpolate": "1.4.5", + "@types/d3-scale": "1.0.22", + "@types/d3-selection": "1.4.6", + "@types/d3-time-format": "2.3.4", + "@types/d3-transition": "1.3.5", + "@types/d3-zoom": "1.8.7" + } + }, + "node_modules/@hpcc-js/dgrid2/node_modules/@hpcc-js/util": { + "version": "2.51.0", + "resolved": "https://registry.npmjs.org/@hpcc-js/util/-/util-2.51.0.tgz", + "integrity": "sha512-xTcU3JhXA0OZQgu2LBLt7rh2O+107IILlEzUIBSS/rR/hVaVOKZK/Jtm5aMIevoAqD/XvKLf8RzurwCF7j/ccw==", + "dependencies": { + "tslib": "2.6.2" } }, "node_modules/@hpcc-js/eclwatch": { - "version": "2.73.44", - "resolved": "https://registry.npmjs.org/@hpcc-js/eclwatch/-/eclwatch-2.73.44.tgz", - "integrity": "sha512-pWIZyKfI2h9aRnPCrxlYno2orM3yF6j/T6tyFxN8oHKsu273i3yAw3GH2VBNKE/rwCwxWmAaSY+1oYM6ugZLDQ==", + "version": "2.74.2", + "resolved": "https://registry.npmjs.org/@hpcc-js/eclwatch/-/eclwatch-2.74.2.tgz", + "integrity": "sha512-FY5CQ/Pezq5enRZtVXzmxV2utv+Fiq7Gn7guMz2IhYWmenNDgclIrfKHeXL8nISJsPNl/VJOHCwyxBWuhuGBdw==", "dependencies": { - "@hpcc-js/codemirror": "^2.61.2", - "@hpcc-js/common": "^2.71.15", - "@hpcc-js/comms": "^2.91.3", - "@hpcc-js/dgrid": "^2.32.16", - "@hpcc-js/graph": "^2.85.13", - "@hpcc-js/layout": "^2.49.20", - "@hpcc-js/phosphor": "^2.18.6", - "@hpcc-js/timeline": "^2.51.23", - "@hpcc-js/tree": "^2.40.15", - "@hpcc-js/util": "^2.50.6" + "@hpcc-js/codemirror": "^2.61.3", + "@hpcc-js/common": "^2.71.16", + "@hpcc-js/comms": "^2.92.0", + "@hpcc-js/dgrid": "^2.32.19", + "@hpcc-js/graph": "^2.85.14", + "@hpcc-js/layout": "^2.49.21", + "@hpcc-js/phosphor": "^2.18.7", + "@hpcc-js/timeline": "^2.51.24", + "@hpcc-js/tree": "^2.40.16", + "@hpcc-js/util": "^2.51.0" + } + }, + "node_modules/@hpcc-js/eclwatch/node_modules/@hpcc-js/chart": { + "version": "2.83.2", + "resolved": "https://registry.npmjs.org/@hpcc-js/chart/-/chart-2.83.2.tgz", + "integrity": "sha512-PePaV/68if4dp+iBDpmBwRbTfOsKht8DkZ7B8NafKfGxL1+khCXf4p4Q/Dlgqig1OfVt35z1eR4lbEUrARhVJw==", + "dependencies": { + "@hpcc-js/api": "^2.12.16", + "@hpcc-js/common": "^2.71.16", + "@hpcc-js/util": "^2.51.0" + } + }, + "node_modules/@hpcc-js/eclwatch/node_modules/@hpcc-js/codemirror": { + "version": "2.61.3", + "resolved": "https://registry.npmjs.org/@hpcc-js/codemirror/-/codemirror-2.61.3.tgz", + "integrity": "sha512-GKLuro8GiMUKu9sCoIsyIXMRbTogG3xGb/yvAuoAKcJQRyJsVamLB7ohyjZkcgY7/JWa3+UBUcABOxiWqG8M/Q==", + "dependencies": { + "@hpcc-js/common": "^2.71.16" + } + }, + "node_modules/@hpcc-js/eclwatch/node_modules/@hpcc-js/common": { + "version": "2.71.16", + "resolved": "https://registry.npmjs.org/@hpcc-js/common/-/common-2.71.16.tgz", + "integrity": "sha512-hz5i9zUXBJrXW5tl30XwgFXwJ2nipzLD9pXQrg1Rw8zfXkQ1Xax22RvGZdASAGPsmHxefyWTK7fpcJd+ipOGOg==", + "dependencies": { + "@hpcc-js/util": "^2.51.0", + "@types/d3-array": "1.2.12", + "@types/d3-brush": "1.1.8", + "@types/d3-collection": "1.0.13", + "@types/d3-color": "1.4.5", + "@types/d3-dispatch": "1.0.12", + "@types/d3-drag": "1.2.8", + "@types/d3-dsv": "1.2.8", + "@types/d3-ease": "1.0.13", + "@types/d3-format": "1.4.5", + "@types/d3-interpolate": "1.4.5", + "@types/d3-scale": "1.0.22", + "@types/d3-selection": "1.4.6", + "@types/d3-time-format": "2.3.4", + "@types/d3-transition": "1.3.5", + "@types/d3-zoom": "1.8.7" + } + }, + "node_modules/@hpcc-js/eclwatch/node_modules/@hpcc-js/comms": { + "version": "2.92.0", + "resolved": "https://registry.npmjs.org/@hpcc-js/comms/-/comms-2.92.0.tgz", + "integrity": "sha512-hGWFUIywb/DHR/yk43C911JY9mwNrion/wt71adfjbckjQJ267GjPkw4tyz8K1YGt5NgCCW+njnR6lAkpjYGfw==", + "dependencies": { + "@hpcc-js/ddl-shim": "^2.20.6", + "@hpcc-js/util": "^2.51.0", + "@xmldom/xmldom": "0.8.10", + "abort-controller": "3.0.0", + "node-fetch": "2.7.0", + "safe-buffer": "5.2.1", + "tmp": "0.2.3", + "undici": "5.28.4" + } + }, + "node_modules/@hpcc-js/eclwatch/node_modules/@hpcc-js/graph": { + "version": "2.85.14", + "resolved": "https://registry.npmjs.org/@hpcc-js/graph/-/graph-2.85.14.tgz", + "integrity": "sha512-grofTqK944A8b/LgigDJHBuM9R9+JIDYfqA5wBssbvty3MtLAuN2seoGFn+I7UEojrCggQllKSxNyi/OXoJrCQ==", + "dependencies": { + "@hpcc-js/api": "^2.12.16", + "@hpcc-js/common": "^2.71.16", + "@hpcc-js/html": "^2.42.19", + "@hpcc-js/react": "^2.53.15", + "@hpcc-js/util": "^2.51.0" + } + }, + "node_modules/@hpcc-js/eclwatch/node_modules/@hpcc-js/html": { + "version": "2.42.19", + "resolved": "https://registry.npmjs.org/@hpcc-js/html/-/html-2.42.19.tgz", + "integrity": "sha512-qocVJXQvwUVaHVXQvn8gIZCXfNHiQOVuMai5wyegYH9KgWJUX3MjUNGHCEYpMsBkk6LBX+D+3myC+VFGlLSgjg==", + "dependencies": { + "@hpcc-js/common": "^2.71.16", + "@hpcc-js/preact-shim": "^2.16.10", + "@hpcc-js/util": "^2.51.0" + } + }, + "node_modules/@hpcc-js/eclwatch/node_modules/@hpcc-js/layout": { + "version": "2.49.21", + "resolved": "https://registry.npmjs.org/@hpcc-js/layout/-/layout-2.49.21.tgz", + "integrity": "sha512-gZSqCBrLDriWW9mhw1bqUL/dzNCsf372CnPjsMLEuMdln7TOOTQm5L0BCjMPVf5kMgyZeT2xRZGr7YURPJIw+g==", + "dependencies": { + "@hpcc-js/api": "^2.12.16", + "@hpcc-js/chart": "^2.83.2", + "@hpcc-js/common": "^2.71.16", + "@hpcc-js/dgrid2": "^2.3.18" + } + }, + "node_modules/@hpcc-js/eclwatch/node_modules/@hpcc-js/other": { + "version": "2.15.21", + "resolved": "https://registry.npmjs.org/@hpcc-js/other/-/other-2.15.21.tgz", + "integrity": "sha512-QUIlQv7nP9+fKNdE8458pqy/cYrEZnVYXBne8uSu2h5q64VSSreCZmO7XY/Rjxf822RigYlZ+fC8K2fZiDOULw==", + "dependencies": { + "@hpcc-js/api": "^2.12.16", + "@hpcc-js/common": "^2.71.16", + "@hpcc-js/layout": "^2.49.21" + } + }, + "node_modules/@hpcc-js/eclwatch/node_modules/@hpcc-js/phosphor": { + "version": "2.18.7", + "resolved": "https://registry.npmjs.org/@hpcc-js/phosphor/-/phosphor-2.18.7.tgz", + "integrity": "sha512-iSQX6vIpawQPbDVhc/CbH8Z4ysSzb+uFjeasd1zIfE77Km5ImH9IiI9OZMOoFYi1zCTCfce/Y7NLC8ADOgg2XQ==", + "dependencies": { + "@hpcc-js/common": "^2.71.16", + "@hpcc-js/other": "^2.15.21", + "@hpcc-js/phosphor-shim": "^2.14.6", + "@hpcc-js/util": "^2.51.0" + } + }, + "node_modules/@hpcc-js/eclwatch/node_modules/@hpcc-js/react": { + "version": "2.53.15", + "resolved": "https://registry.npmjs.org/@hpcc-js/react/-/react-2.53.15.tgz", + "integrity": "sha512-X8e1lIk4oRXFNTFxrcZ1YbJDi6t7IU431Lzq0nTIFJqWIDRZgjJ3gKxSGcjtjNYzhUqq4A9KfcdvKNE+wHrdjw==", + "dependencies": { + "@hpcc-js/common": "^2.71.16", + "@hpcc-js/preact-shim": "^2.16.10" + } + }, + "node_modules/@hpcc-js/eclwatch/node_modules/@hpcc-js/tree": { + "version": "2.40.16", + "resolved": "https://registry.npmjs.org/@hpcc-js/tree/-/tree-2.40.16.tgz", + "integrity": "sha512-UCFA3ky9aB0XqrN4PyNmwkY3zl3VSc4araEfHpjtOcT7r7pUVJNEG+KjYPkCTUvvKYoPIuE2FBGtr6ec0bM5Aw==", + "dependencies": { + "@hpcc-js/api": "^2.12.16", + "@hpcc-js/common": "^2.71.16" + } + }, + "node_modules/@hpcc-js/eclwatch/node_modules/@hpcc-js/util": { + "version": "2.51.0", + "resolved": "https://registry.npmjs.org/@hpcc-js/util/-/util-2.51.0.tgz", + "integrity": "sha512-xTcU3JhXA0OZQgu2LBLt7rh2O+107IILlEzUIBSS/rR/hVaVOKZK/Jtm5aMIevoAqD/XvKLf8RzurwCF7j/ccw==", + "dependencies": { + "tslib": "2.6.2" + } + }, + "node_modules/@hpcc-js/eclwatch/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/@hpcc-js/eclwatch/node_modules/undici": { + "version": "5.28.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", + "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" } }, "node_modules/@hpcc-js/graph": { @@ -2054,16 +2313,87 @@ } }, "node_modules/@hpcc-js/timeline": { - "version": "2.51.23", - "resolved": "https://registry.npmjs.org/@hpcc-js/timeline/-/timeline-2.51.23.tgz", - "integrity": "sha512-+puiTarYe0he9XUcVP9NA08X8SAvqTMcoRkHNYrKfTIa0MI1i67nbo/D9MdoBGbVN7S5dyz40CcX13a1wMk1DA==", + "version": "2.51.24", + "resolved": "https://registry.npmjs.org/@hpcc-js/timeline/-/timeline-2.51.24.tgz", + "integrity": "sha512-QNgXhJ6/hQHfP2Lge2zL1X5ERI813KKpFN+DNFqufhWoZIT/7x3kr1If8r1mC74hYt4xqkFAdoveEepFT+lYhQ==", "dependencies": { - "@hpcc-js/api": "^2.12.15", - "@hpcc-js/chart": "^2.83.1", - "@hpcc-js/common": "^2.71.15", - "@hpcc-js/html": "^2.42.18", - "@hpcc-js/layout": "^2.49.20", - "@hpcc-js/react": "^2.53.14" + "@hpcc-js/api": "^2.12.16", + "@hpcc-js/chart": "^2.83.2", + "@hpcc-js/common": "^2.71.16", + "@hpcc-js/html": "^2.42.19", + "@hpcc-js/layout": "^2.49.21", + "@hpcc-js/react": "^2.53.15" + } + }, + "node_modules/@hpcc-js/timeline/node_modules/@hpcc-js/chart": { + "version": "2.83.2", + "resolved": "https://registry.npmjs.org/@hpcc-js/chart/-/chart-2.83.2.tgz", + "integrity": "sha512-PePaV/68if4dp+iBDpmBwRbTfOsKht8DkZ7B8NafKfGxL1+khCXf4p4Q/Dlgqig1OfVt35z1eR4lbEUrARhVJw==", + "dependencies": { + "@hpcc-js/api": "^2.12.16", + "@hpcc-js/common": "^2.71.16", + "@hpcc-js/util": "^2.51.0" + } + }, + "node_modules/@hpcc-js/timeline/node_modules/@hpcc-js/common": { + "version": "2.71.16", + "resolved": "https://registry.npmjs.org/@hpcc-js/common/-/common-2.71.16.tgz", + "integrity": "sha512-hz5i9zUXBJrXW5tl30XwgFXwJ2nipzLD9pXQrg1Rw8zfXkQ1Xax22RvGZdASAGPsmHxefyWTK7fpcJd+ipOGOg==", + "dependencies": { + "@hpcc-js/util": "^2.51.0", + "@types/d3-array": "1.2.12", + "@types/d3-brush": "1.1.8", + "@types/d3-collection": "1.0.13", + "@types/d3-color": "1.4.5", + "@types/d3-dispatch": "1.0.12", + "@types/d3-drag": "1.2.8", + "@types/d3-dsv": "1.2.8", + "@types/d3-ease": "1.0.13", + "@types/d3-format": "1.4.5", + "@types/d3-interpolate": "1.4.5", + "@types/d3-scale": "1.0.22", + "@types/d3-selection": "1.4.6", + "@types/d3-time-format": "2.3.4", + "@types/d3-transition": "1.3.5", + "@types/d3-zoom": "1.8.7" + } + }, + "node_modules/@hpcc-js/timeline/node_modules/@hpcc-js/html": { + "version": "2.42.19", + "resolved": "https://registry.npmjs.org/@hpcc-js/html/-/html-2.42.19.tgz", + "integrity": "sha512-qocVJXQvwUVaHVXQvn8gIZCXfNHiQOVuMai5wyegYH9KgWJUX3MjUNGHCEYpMsBkk6LBX+D+3myC+VFGlLSgjg==", + "dependencies": { + "@hpcc-js/common": "^2.71.16", + "@hpcc-js/preact-shim": "^2.16.10", + "@hpcc-js/util": "^2.51.0" + } + }, + "node_modules/@hpcc-js/timeline/node_modules/@hpcc-js/layout": { + "version": "2.49.21", + "resolved": "https://registry.npmjs.org/@hpcc-js/layout/-/layout-2.49.21.tgz", + "integrity": "sha512-gZSqCBrLDriWW9mhw1bqUL/dzNCsf372CnPjsMLEuMdln7TOOTQm5L0BCjMPVf5kMgyZeT2xRZGr7YURPJIw+g==", + "dependencies": { + "@hpcc-js/api": "^2.12.16", + "@hpcc-js/chart": "^2.83.2", + "@hpcc-js/common": "^2.71.16", + "@hpcc-js/dgrid2": "^2.3.18" + } + }, + "node_modules/@hpcc-js/timeline/node_modules/@hpcc-js/react": { + "version": "2.53.15", + "resolved": "https://registry.npmjs.org/@hpcc-js/react/-/react-2.53.15.tgz", + "integrity": "sha512-X8e1lIk4oRXFNTFxrcZ1YbJDi6t7IU431Lzq0nTIFJqWIDRZgjJ3gKxSGcjtjNYzhUqq4A9KfcdvKNE+wHrdjw==", + "dependencies": { + "@hpcc-js/common": "^2.71.16", + "@hpcc-js/preact-shim": "^2.16.10" + } + }, + "node_modules/@hpcc-js/timeline/node_modules/@hpcc-js/util": { + "version": "2.51.0", + "resolved": "https://registry.npmjs.org/@hpcc-js/util/-/util-2.51.0.tgz", + "integrity": "sha512-xTcU3JhXA0OZQgu2LBLt7rh2O+107IILlEzUIBSS/rR/hVaVOKZK/Jtm5aMIevoAqD/XvKLf8RzurwCF7j/ccw==", + "dependencies": { + "tslib": "2.6.2" } }, "node_modules/@hpcc-js/tree": { diff --git a/esp/src/package.json b/esp/src/package.json index 3a6501298f3..245072a1ddd 100644 --- a/esp/src/package.json +++ b/esp/src/package.json @@ -46,7 +46,7 @@ "@hpcc-js/common": "2.71.15", "@hpcc-js/comms": "2.91.3", "@hpcc-js/dataflow": "8.1.6", - "@hpcc-js/eclwatch": "2.73.44", + "@hpcc-js/eclwatch": "2.74.2", "@hpcc-js/graph": "2.85.13", "@hpcc-js/html": "2.42.18", "@hpcc-js/layout": "2.49.20", From 959dba8b61e406f6c716fa782b43cbbbb31c07e8 Mon Sep 17 00:00:00 2001 From: Gordon Smith Date: Fri, 19 Apr 2024 16:17:29 +0100 Subject: [PATCH 33/44] HPCC-31567 Add Next + Prev buttons to WU Details Page Signed-off-by: Gordon Smith --- .../src-react/components/WorkunitSummary.tsx | 77 ++++++++++++++----- esp/src/src-react/components/Workunits.tsx | 3 - esp/src/src/nls/hpcc.ts | 3 + 3 files changed, 60 insertions(+), 23 deletions(-) diff --git a/esp/src/src-react/components/WorkunitSummary.tsx b/esp/src/src-react/components/WorkunitSummary.tsx index 014fec2725d..b4e9ab7b998 100644 --- a/esp/src/src-react/components/WorkunitSummary.tsx +++ b/esp/src/src-react/components/WorkunitSummary.tsx @@ -1,9 +1,11 @@ import * as React from "react"; import { CommandBar, ContextualMenuItemType, ICommandBarItemProps, MessageBar, MessageBarType, ScrollablePane, ScrollbarVisibility, Sticky, StickyPositionType } from "@fluentui/react"; +import { WUQuery, WorkunitsService } from "@hpcc-js/comms"; import { scopedLogger } from "@hpcc-js/util"; import nlsHPCC from "src/nlsHPCC"; import { WUStatus } from "src/react/index"; import { formatCost } from "src/Session"; +import { isNumeric, wuidToDate, wuidToTime } from "src/Utility"; import { useConfirm } from "../hooks/confirm"; import { useWorkunit, useWorkunitExceptions } from "../hooks/workunit"; import { ReflexContainer, ReflexElement, ReflexSplitter } from "../layouts/react-reflex"; @@ -15,10 +17,16 @@ import { SlaveLogs } from "./forms/SlaveLogs"; import { ZAPDialog } from "./forms/ZAPDialog"; import { InfoGrid } from "./InfoGrid"; import { WorkunitPersona } from "./controls/StateIcon"; -import { isNumeric } from "src/Utility"; const logger = scopedLogger("../components/WorkunitDetails.tsx"); +const workunitService = new WorkunitsService({ baseUrl: "" }); + +interface MessageBarContent { + type: MessageBarType; + message: string; +} + interface WorkunitSummaryProps { wuid: string; } @@ -36,8 +44,15 @@ export const WorkunitSummary: React.FunctionComponent = ({ const [showZapForm, setShowZapForm] = React.useState(false); const [showThorSlaveLogs, setShowThorSlaveLogs] = React.useState(false); - const [showMessageBar, setShowMessageBar] = React.useState(false); - const dismissMessageBar = React.useCallback(() => setShowMessageBar(false), []); + const [messageBarContent, setMessageBarContent] = React.useState(); + const dismissMessageBar = React.useCallback(() => setMessageBarContent(undefined), []); + const showMessageBar = React.useCallback((content: MessageBarContent) => { + setMessageBarContent(content); + const t = window.setTimeout(function () { + dismissMessageBar(); + window.clearTimeout(t); + }, 2400); + }, [dismissMessageBar]); React.useEffect(() => { setJobname(workunit?.Jobname); @@ -69,7 +84,39 @@ export const WorkunitSummary: React.FunctionComponent = ({ }, [workunit]) }); + const nextWuid = React.useCallback((wuids: WUQuery.ECLWorkunit[]) => { + let found = false; + for (const wu of wuids) { + if (wu.Wuid !== wuid) { + pushUrl(`/workunits/${wu.Wuid}`); + found = true; + break; + } + } + if (!found) { + showMessageBar({ type: MessageBarType.warning, message: nlsHPCC.WorkunitNotFound }); + } + }, [showMessageBar, wuid]); + const buttons = React.useMemo((): ICommandBarItemProps[] => [ + { + key: "next", iconOnly: true, tooltipHostProps: { content: nlsHPCC.NextWorkunit }, iconProps: { iconName: "Previous" }, + onClick: () => { + const now = new Date(Date.now()); + workunitService.WUQuery({ StartDate: `${wuidToDate(wuid)}T${wuidToTime(wuid)}Z`, EndDate: now.toISOString(), Sortby: "Wuid", Descending: false, Count: 2 } as WUQuery.Request).then(response => { + nextWuid(response?.Workunits?.ECLWorkunit || []); + }).catch(err => logger.error(err)); + } + }, + { + key: "previous", iconOnly: true, tooltipHostProps: { content: nlsHPCC.PreviousWorkunit }, iconProps: { iconName: "Next" }, + onClick: () => { + workunitService.WUQuery({ EndDate: `${wuidToDate(wuid)}T${wuidToTime(wuid)}Z`, Count: 2 } as WUQuery.Request).then(response => { + nextWuid(response?.Workunits?.ECLWorkunit || []); + }).catch(err => logger.error(err)); + } + }, + { key: "divider_0", itemType: ContextualMenuItemType.Divider, onRender: () => }, { key: "refresh", text: nlsHPCC.Refresh, iconProps: { iconName: "Refresh" }, onClick: () => { @@ -91,15 +138,9 @@ export const WorkunitSummary: React.FunctionComponent = ({ Jobname: jobname, Description: description, Protected: _protected - }) - .then(_ => { - setShowMessageBar(true); - const t = window.setTimeout(function () { - setShowMessageBar(false); - window.clearTimeout(t); - }, 2400); - }) - .catch(err => logger.error(err)); + }).then(_ => { + showMessageBar({ type: MessageBarType.success, message: nlsHPCC.SuccessfullySaved }); + }).catch(err => logger.error(err)); } }, { @@ -163,7 +204,7 @@ export const WorkunitSummary: React.FunctionComponent = ({ key: "slaveLogs", text: nlsHPCC.SlaveLogs, disabled: !workunit?.ThorLogList, onClick: () => setShowThorSlaveLogs(true) }, - ], [_protected, canDelete, canDeschedule, canReschedule, canSave, description, jobname, refresh, refreshSavings, setShowDeleteConfirm, workunit, wuid]); + ], [_protected, canDelete, canDeschedule, canReschedule, canSave, description, jobname, nextWuid, refresh, refreshSavings, setShowDeleteConfirm, showMessageBar, workunit, wuid]); const serviceNames = React.useMemo(() => { return workunit?.ServiceNames?.Item?.join("\n") || ""; @@ -191,13 +232,9 @@ export const WorkunitSummary: React.FunctionComponent = ({ - {showMessageBar && - - {nlsHPCC.SuccessfullySaved} + {messageBarContent && + + {messageBarContent.message} } diff --git a/esp/src/src-react/components/Workunits.tsx b/esp/src/src-react/components/Workunits.tsx index 88b3236c38a..504f1f698c4 100644 --- a/esp/src/src-react/components/Workunits.tsx +++ b/esp/src/src-react/components/Workunits.tsx @@ -55,9 +55,6 @@ function formatQuery(_filter): { [id: string]: any } { if (filter.Type === true) { filter.Type = "archived workunits"; } - if (filter.Type === true) { - filter.Type = "archived workunits"; - } if (filter.Protected === true) { filter.Protected = "Protected"; } diff --git a/esp/src/src/nls/hpcc.ts b/esp/src/src/nls/hpcc.ts index 5eb1fa02db9..1731446b844 100644 --- a/esp/src/src/nls/hpcc.ts +++ b/esp/src/src/nls/hpcc.ts @@ -577,6 +577,7 @@ export = { Newest: "Newest", NewPassword: "New Password", NextSelection: "Next Selection", + NextWorkunit: "Next Workunit", NoContent: "(No content)", NoContentPleaseSelectItem: "No content - please select an item", NoCommon: "No Common", @@ -706,6 +707,7 @@ export = { PressCtrlCToCopy: "Press ctrl+c to copy.", Preview: "Preview", PreviousSelection: "Previous Selection", + PreviousWorkunit: "Previous Workunit", PrimaryLost: "Primary Lost", PrimaryMonitoring: "Primary Monitoring", Priority: "Priority", @@ -1112,6 +1114,7 @@ export = { WildcardFilter: "Wildcard Filter", Workflows: "Workflows", Workunit: "Workunit", + WorkunitNotFound: "Workunit not found", Workunits: "Workunits", WorkUnitScopeDefaultPermissions: "Workunit Scope Default Permissions", Wrap: "Wrap", From 630b5f21d566ebf3164e9b45b103140196c5e55b Mon Sep 17 00:00:00 2001 From: Gordon Smith Date: Thu, 25 Apr 2024 12:27:02 +0100 Subject: [PATCH 34/44] HPCC-31690 ECL tab empty for WUs with no metrics Signed-off-by: Gordon Smith --- esp/src/src-react/components/ECLArchive.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/esp/src/src-react/components/ECLArchive.tsx b/esp/src/src-react/components/ECLArchive.tsx index ca4ee1de6ae..469b6ba4e30 100644 --- a/esp/src/src-react/components/ECLArchive.tsx +++ b/esp/src/src-react/components/ECLArchive.tsx @@ -53,8 +53,9 @@ export const ECLArchive: React.FunctionComponent = ({ }, [archive, metrics]); React.useEffect(() => { - if (metrics.length) { - setSelectionText(archive?.content(selection) ?? ""); + const text = archive?.content(selection) ?? ""; + if (text) { + setSelectionText(text); setMarkers(archive?.markers(selection) ?? []); setSelectedMetrics(archive?.metrics(selection) ?? []); } else { From 456e53247d5edc3afd54d5bdd203ae4ae3cdc0ec Mon Sep 17 00:00:00 2001 From: Jake Smith Date: Thu, 25 Apr 2024 13:20:14 +0100 Subject: [PATCH 35/44] HPCC-31691 Fix securesocket readtms when min_size = 0 Match semantics of jsocket readtms when min_size is 0. jsocket always blocks initially, which means in effect, min_size > 0 Signed-off-by: Jake Smith --- system/jlib/jsocket.cpp | 2 ++ system/security/securesocket/securesocket.cpp | 18 +++++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/system/jlib/jsocket.cpp b/system/jlib/jsocket.cpp index a06315afcb4..4142a6bd125 100644 --- a/system/jlib/jsocket.cpp +++ b/system/jlib/jsocket.cpp @@ -1931,6 +1931,8 @@ void CSocket::readtms(void* buf, size32_t min_size, size32_t max_size, size32_t if (state != ss_open) THROWJSOCKEXCEPTION(JSOCKERR_not_opened); + // NB: The semantics here, effectively mean min_size is always >0, because it first waits on wait_read + // i.e. something has to be on socket to continue (or error/graceful close). CCycleTimer timer; while (true) { diff --git a/system/security/securesocket/securesocket.cpp b/system/security/securesocket/securesocket.cpp index de953a56769..5340ee53d12 100644 --- a/system/security/securesocket/securesocket.cpp +++ b/system/security/securesocket/securesocket.cpp @@ -834,6 +834,12 @@ void CSecureSocket::readtms(void* buf, size32_t min_size, size32_t max_size, siz sizeRead = 0; CCycleTimer timer; + // for semantics to work with a timeout, have to be non-blocking when reading SSL + // because wait_read can't guarantee that there are bytes ready to read, only that + // there are bytes pending on the underlying socket. + // We put in non-blocking mode, so that if after wait_read says there's something, + // SSL_read won't block and will respond with a SSL_ERROR_WANT_READ/SSL_ERROR_WANT_WRITE + // if not ready. ScopedNonBlockingMode scopedNonBlockingMode; if (WAIT_FOREVER != timeoutMs) scopedNonBlockingMode.init(this); @@ -870,9 +876,19 @@ void CSecureSocket::readtms(void* buf, size32_t min_size, size32_t max_size, siz else { ssl_err = SSL_get_error(m_ssl, rc); + // NB: if timeout != WAIT_FOREVER, nonBlocking should always be true here if (nonBlocking && (ssl_err == SSL_ERROR_WANT_READ || ssl_err == SSL_ERROR_WANT_WRITE)) // NB: SSL_read can cause SSL_ERROR_WANT_WRITE { - if (0 == min_size) // if here, implies nothing read, since it would have exited already in (rc > 0) block. + if (0 == sizeRead) + { + // special case. We have read nothing, but we are here because wait_read said there was something to read. + // However, SSL_read returned SSL_ERROR_WANT_READ/SSL_ERROR_WANT_WRITE, indicating infact there is nothing + // ready yet. + + // To maintain consistent semantics with jsocket. Continue waiting. + // NB: jsocket::readtms always blocks (wait_read) initially, meaning in effect min_size is always >0 + } + else if (sizeRead >= min_size) // could have read some before, but now would block and above min_size, exit. break; } else From f5fed514aaf9f65bb7688d0a2b00bf7a5bc048ce Mon Sep 17 00:00:00 2001 From: Jake Smith Date: Thu, 25 Apr 2024 15:04:34 +0100 Subject: [PATCH 36/44] HPCC-31691 review Signed-off-by: Jake Smith --- system/security/securesocket/securesocket.cpp | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/system/security/securesocket/securesocket.cpp b/system/security/securesocket/securesocket.cpp index 5340ee53d12..2b276bef1cc 100644 --- a/system/security/securesocket/securesocket.cpp +++ b/system/security/securesocket/securesocket.cpp @@ -879,17 +879,10 @@ void CSecureSocket::readtms(void* buf, size32_t min_size, size32_t max_size, siz // NB: if timeout != WAIT_FOREVER, nonBlocking should always be true here if (nonBlocking && (ssl_err == SSL_ERROR_WANT_READ || ssl_err == SSL_ERROR_WANT_WRITE)) // NB: SSL_read can cause SSL_ERROR_WANT_WRITE { - if (0 == sizeRead) - { - // special case. We have read nothing, but we are here because wait_read said there was something to read. - // However, SSL_read returned SSL_ERROR_WANT_READ/SSL_ERROR_WANT_WRITE, indicating infact there is nothing - // ready yet. + // NB: we must be below min_size if here (otherwise would have exited in (rc > 0) block above) - // To maintain consistent semantics with jsocket. Continue waiting. - // NB: jsocket::readtms always blocks (wait_read) initially, meaning in effect min_size is always >0 - } - else if (sizeRead >= min_size) // could have read some before, but now would block and above min_size, exit. - break; + // To maintain consistent semantics with jsocket, we continue waiting even in the min_size = 0 case. + // NB: jsocket::readtms always blocks (wait_read) initially, meaning in effect min_size is always treated as >0 } else { From 930bccdcf284370e7fb012464246831f27ca6616 Mon Sep 17 00:00:00 2001 From: Michael Gardner Date: Tue, 30 Jan 2024 11:44:00 -0500 Subject: [PATCH 37/44] HPCC-31271 Add User Repository Build devdoc Signed-off-by: Michael Gardner --- devdoc/UserBuildAssets.md | 146 ++++++++++++++++++ .../images/HPCC-12345-build-in-progress.png | Bin 0 -> 184168 bytes .../images/actions-secrets-and-variables.png | Bin 0 -> 173164 bytes .../resources/images/repository-tag-tab.png | Bin 0 -> 72083 bytes 4 files changed, 146 insertions(+) create mode 100644 devdoc/UserBuildAssets.md create mode 100644 devdoc/resources/images/HPCC-12345-build-in-progress.png create mode 100644 devdoc/resources/images/actions-secrets-and-variables.png create mode 100644 devdoc/resources/images/repository-tag-tab.png diff --git a/devdoc/UserBuildAssets.md b/devdoc/UserBuildAssets.md new file mode 100644 index 00000000000..e38375ac754 --- /dev/null +++ b/devdoc/UserBuildAssets.md @@ -0,0 +1,146 @@ +# Build Assets for individual developer + +## Build Assets +The modern tool used for generating all our official assets is the Github Actions build-asset workflow on the hpcc-systems/HPCC-Platform repository, located [here](https://github.com/hpcc-systems/HPCC-Platform/actions/workflows/build-assets.yml). Developers and contributors can utilize this same workflow on their own forked repository. This allows developers to quickly create assets for testing changes and test for errors before the peer review process. + +Build assets will generate every available project under the HPCC-Platform namespace. There currently is not an option to control which packages in the build matrix get generated. But most packages get built in parallel, and __released__ after the individual matrix job is completed, so there is no waiting on packages you don't need. Exceptions to this are for packages that require other builds to complete, such as the __ECLIDE__. + +Upon completion of each step and matrix job in the workflow, the assets will be output to the repositories tags tab. An example for the `hpcc-systems` user repository is [hpcc-systems/HPCC-Platform/tags](https://github.com/hpcc-systems/HPCC-Platform/tags). + +![Tag tab screenshot](/devdoc/resources/images/repository-tag-tab.png) + +## Dependent variables +The build assets workflow requires several __repository secrets__ be available on a developers machine in order to run properly. You can access these secrets and variables by going to the `settings` tab in your forked repository, and then clicking on the `Secrets and Variables - Actions` drop down under `Security` on the lefthand side of the settings screen. + +![Actions secrets and variables](/devdoc/resources/images/actions-secrets-and-variables.png) + +Create a secret by clicking the green `New Repository Secret` button. The following secrets are needed; + +* LNB_ACTOR - Your Github username +* LNB_TOKEN - Classic Github token for your user with LN repo access +* DOCKER_USERNAME - Your docker.io username +* DOCKER_PASSWORD - Your docker.io password +* SIGNING_CERTIFICATE - pks12 self signed cert encoded to base64 for windows signing +* SIGNING_CERTIFICATE_PASSPHRASE - passphrase for pks12 cert +* SIGNING_SECRET - ssh-keygen private key for signing linux builds +* SIGN_MODULES_KEYID - email used to generate key +* SIGN_MODULES_PASSPHRASE - passphrase for private key + +### Generating the windows signing certificate +To generate the self signed certificate for windows packages, you will need to do the following steps. + +1. Generate a root certificate authority + +```openssl req -x509 -sha256 -days 365 -nodes -newkey rsa:2048 -subj "/CN=example.com/C=US/L=Boca Raton" -keyout rootCA.key -out rootCA.crt``` + +2. Create the server secret key + +`openssl genrsa -out server.key 2048` + +3. generate a csr.conf file +``` +cat > csr.conf < cert.conf < hpcc_sign_cert.base64` + +On MacOS: +`base64 -i hpcc_sign_cert.pfx -o hpcc_sign_cert.base64` + +From here you can `cat` the output of hpcc_sign_cert.base64 and copy the output into the variable SIGNING_CERTIFICATE in Github Actions. + +### Generating a signing key for linux builds +For linux builds we're going to generate a private key using GnuPG (gpg). + +Start the process by entering a terminal and run the command;`gpg --full-generate-key` + +You will be given several options in this process. + +For type of key, select `RSA and RSA default`. + +For keysize, enter `4096`. + +For expiration date, select `0 = key does not expire`. + +Input your real name. + +Input your company email address. + +For comment, input something like `Github actions key for signing linux builds`. + +Then it will ask you to enter a passphrase for the key, and confirm the passphrase. Do not leave this blank. + +A key should be output and entered into your gpg keychain. Now we need to export the key for use in the github actions secret. + +To extract your key run `gpg --output private.pgp --armor --export-secret-key `. + +Now open private.pgp, copy all, and go to github actions secrets. Paste the output into the secret "SIGNING_SECRET" + +## Starting a build +The build-asset workflow is kicked off by a tag being pushed to the developers HPCC-Platform repository. Before we push the tag to our HPCC-Platform repository, we will want to have other tags in place if we want LN and ECLIDE builds to function correctly. Suggested tag patterns are `community_HPCC-12345-rc1` or `HPCC-12345-rc1`. + +If you choose not to tag the LN and ECLIDE builds, the community builds will generate but errors will be thrown for any build utilizing the LN repository. ECLIDE will not even attempt a build unless you are also successfully building LN due to the dependency scheme we use. The 'Baremetal' builds are designed to generate our clienttools targets for windows-2022 and macos-12 distributions. These jobs contain both the COMMUNITY and LN builds. If the LN build is not tagged, the COMMUNITY section of the job will run, and the assets will be uploaded, but the job will fail when it tries to build LN. + +If you choose to precede your Jira number with `community_` then you must tag LN with `internal_` and ECLIDE with `eclide_`. Otherwise just use the Jira tag in all three repositories. + +Once the LN and ECLIDE repository tags have been created and pushed with the same base branch that your work is based on for the HPCC-Platform, then you are free to push the HPCC-Platform tag which will initiate the build process. + +The summary of the build-asset workflow can then be viewed for progress, and individual jobs can be selected to check build outputs. +![Build Summary HPCC-12345](/devdoc/resources/images/HPCC-12345-build-in-progress.png) + +## Asset output + +Assets from the workflow will be released into the corresponding tag location, either in the HPCC-Platform repository for all community based builds, or the LN repository for any builds containing proprietary plugins. Simply browse to the releases or tag tab of your repository and select the tag name you just built. The assets will show up there as the build completes. An example of this on the hpcc-systems repository is [hpcc-systems/HPCC-Platform/releases](https://github.com/hpcc-systems/HPCC-Platform/releases). \ No newline at end of file diff --git a/devdoc/resources/images/HPCC-12345-build-in-progress.png b/devdoc/resources/images/HPCC-12345-build-in-progress.png new file mode 100644 index 0000000000000000000000000000000000000000..70185a9e6ac7d1e6ea903a45f4955e0ebebc8e4c GIT binary patch literal 184168 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 G;Qs@AaM^?a literal 0 HcmV?d00001 diff --git a/devdoc/resources/images/actions-secrets-and-variables.png b/devdoc/resources/images/actions-secrets-and-variables.png new file mode 100644 index 0000000000000000000000000000000000000000..1c267910fc55d498c9864968361a746176f0fe23 GIT binary patch literal 173164 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 bIdzYrhCg}|>lg=v0}e@1S&{Nj`rrQx859tV literal 0 HcmV?d00001 diff --git a/devdoc/resources/images/repository-tag-tab.png b/devdoc/resources/images/repository-tag-tab.png new file mode 100644 index 0000000000000000000000000000000000000000..16bdb37acbc939a22f3df1881fd09636b05726a0 GIT binary patch literal 72083 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 ~SsXN57R?zB1 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 literal 0 HcmV?d00001 From 5ce6cbdfc68ca830abaf148e237674621b54d1fc Mon Sep 17 00:00:00 2001 From: Gordon Smith Date: Fri, 26 Apr 2024 09:41:46 +0100 Subject: [PATCH 38/44] HPCC-31567 Add Next + Prev buttons to WU Details Page Add extra day for "next" to account for servers not on UTC Signed-off-by: Gordon Smith --- esp/src/src-react/components/WorkunitSummary.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/esp/src/src-react/components/WorkunitSummary.tsx b/esp/src/src-react/components/WorkunitSummary.tsx index b4e9ab7b998..f168fd8a930 100644 --- a/esp/src/src-react/components/WorkunitSummary.tsx +++ b/esp/src/src-react/components/WorkunitSummary.tsx @@ -103,7 +103,8 @@ export const WorkunitSummary: React.FunctionComponent = ({ key: "next", iconOnly: true, tooltipHostProps: { content: nlsHPCC.NextWorkunit }, iconProps: { iconName: "Previous" }, onClick: () => { const now = new Date(Date.now()); - workunitService.WUQuery({ StartDate: `${wuidToDate(wuid)}T${wuidToTime(wuid)}Z`, EndDate: now.toISOString(), Sortby: "Wuid", Descending: false, Count: 2 } as WUQuery.Request).then(response => { + const tomorrow = new Date(now.getTime() + (24 * 60 * 60 * 1000)); + workunitService.WUQuery({ StartDate: `${wuidToDate(wuid)}T${wuidToTime(wuid)}Z`, EndDate: tomorrow.toISOString(), Sortby: "Wuid", Descending: false, Count: 2 } as WUQuery.Request).then(response => { nextWuid(response?.Workunits?.ECLWorkunit || []); }).catch(err => logger.error(err)); } From 16b212cffc956fd540754efc53857da2e9cf1f72 Mon Sep 17 00:00:00 2001 From: Gavin Halliday Date: Tue, 9 Apr 2024 13:47:37 +0100 Subject: [PATCH 39/44] HPCC-31566 Allow stub resources to be configured per component Signed-off-by: Gavin Halliday --- helm/hpcc/templates/_helpers.tpl | 22 +- helm/hpcc/templates/eclagent.yaml | 2 +- helm/hpcc/templates/eclccserver.yaml | 3 +- helm/hpcc/templates/eclscheduler.yaml | 3 +- helm/hpcc/templates/roxie.yaml | 3 +- helm/hpcc/templates/thor.yaml | 4 +- helm/hpcc/values.schema.json | 12 + testing/helm/tests/resourced.yaml | 867 ++++++++++++++++++++++++++ 8 files changed, 899 insertions(+), 17 deletions(-) create mode 100644 testing/helm/tests/resourced.yaml diff --git a/helm/hpcc/templates/_helpers.tpl b/helm/hpcc/templates/_helpers.tpl index 08a7ea8647c..cdf94da836b 100644 --- a/helm/hpcc/templates/_helpers.tpl +++ b/helm/hpcc/templates/_helpers.tpl @@ -1315,9 +1315,10 @@ Add resource object Pass in a dictionary with me defined */}} {{- define "hpcc.addResources" }} -{{- if .me }} - {{- $limits := omit .me "cpu" }} - {{- $requests := pick .me "cpu" }} +{{- $resources := .me | default .defaults }} +{{- if $resources }} + {{- $limits := omit $resources "cpu" }} + {{- $requests := pick $resources "cpu" }} resources: {{- if $limits }} limits: @@ -1335,17 +1336,16 @@ Add resources object for stub pods Pass in dict with root, me and instances defined */}} {{- define "hpcc.addStubResources" -}} -{{- $stubInstanceResources := .root.Values.global.stubInstanceResources | default dict -}} -{{- $milliCPUPerInstance := $stubInstanceResources.cpu | default "50m" -}} -{{- $memPerInstance := $stubInstanceResources.memory | default "200Mi" -}} -{{- $milliCPUs := int (include "hpcc.k8sCPUStringToMilliCPU" $milliCPUPerInstance) -}} -{{- $bytes := int64 (include "hpcc.k8sMemoryStringToBytes" $memPerInstance) -}} -{{- $totalBytes := mul .instances $bytes }} +{{- $stubInstanceResources := .stubResources | default .root.Values.global.stubInstanceResources | default dict }} +{{- $milliCPUText := $stubInstanceResources.cpu | default "200m" }} +{{- $milliCPUs := int (include "hpcc.k8sCPUStringToMilliCPU" $milliCPUText) }} +{{- $memoryText := $stubInstanceResources.memory | default "50Mi" }} +{{- $memory := int64 (include "hpcc.k8sMemoryStringToBytes" $memoryText) }} resources: limits: - memory: {{ include "hpcc.bytesToK8sMemoryString" $totalBytes | quote }} + memory: {{ include "hpcc.bytesToK8sMemoryString" $memory | quote }} requests: - cpu: {{ printf "%dm" (mul .instances $milliCPUs) | quote }} + cpu: {{ printf "%dm" $milliCPUs | quote }} {{- end -}} {{/* diff --git a/helm/hpcc/templates/eclagent.yaml b/helm/hpcc/templates/eclagent.yaml index 3648f8836af..d74cdefae34 100644 --- a/helm/hpcc/templates/eclagent.yaml +++ b/helm/hpcc/templates/eclagent.yaml @@ -172,7 +172,7 @@ spec: {{- if .useChildProcesses }} {{- include "hpcc.addResources" (dict "me" .resources) | indent 8 }} {{- else }} -{{- include "hpcc.addStubResources" ($commonCtx | merge (dict "instances" .maxActive)) | indent 8 }} +{{- include "hpcc.addStubResources" ($commonCtx | merge (dict "stubResources" .stubResources)) | indent 8 }} {{- end }} {{- end }} {{ include "hpcc.addImageAttrs" $commonCtx | indent 8 }} diff --git a/helm/hpcc/templates/eclccserver.yaml b/helm/hpcc/templates/eclccserver.yaml index 15060d85cb1..ff03688c5b2 100644 --- a/helm/hpcc/templates/eclccserver.yaml +++ b/helm/hpcc/templates/eclccserver.yaml @@ -180,7 +180,8 @@ spec: {{- if .useChildProcesses }} {{- include "hpcc.addResources" (dict "me" .resources) | indent 8 }} {{- else }} -{{- include "hpcc.addStubResources" ($commonCtx | merge (dict "instances" .maxActive)) | indent 8 }} +{{- $defaultResources := dict "cpu" "1" "memory" "1Gi" }} +{{- include "hpcc.addResources" (dict "me" .timedChildResources "defaults" $defaultResources) | indent 8 }} {{- end }} {{- end }} {{ include "hpcc.addImageAttrs" $commonCtx | indent 8 }} diff --git a/helm/hpcc/templates/eclscheduler.yaml b/helm/hpcc/templates/eclscheduler.yaml index b535921c65a..32a65f2778e 100644 --- a/helm/hpcc/templates/eclscheduler.yaml +++ b/helm/hpcc/templates/eclscheduler.yaml @@ -95,7 +95,8 @@ spec: {{- include "hpcc.addSecurityContext" $commonCtx | indent 8 }} {{- $omitResources := hasKey $.Values.global "omitResources" | ternary $.Values.global.omitResources $.Values.global.privileged }} {{- if not $omitResources }} -{{- include "hpcc.addStubResources" ($commonCtx | merge (dict "instances" 1)) | indent 8 }} +{{- $defaultResources := dict "cpu" "500m" "memory" "200Mi" }} +{{- include "hpcc.addResources" (dict "me" .resources "defaults" $defaultResources) | indent 8 }} {{- end }} {{ include "hpcc.addImageAttrs" $commonCtx | indent 8 }} volumeMounts: diff --git a/helm/hpcc/templates/roxie.yaml b/helm/hpcc/templates/roxie.yaml index 969574f48a9..c1e6ccd8bd3 100644 --- a/helm/hpcc/templates/roxie.yaml +++ b/helm/hpcc/templates/roxie.yaml @@ -148,7 +148,8 @@ spec: {{- include "hpcc.addSecurityContext" $commonCtx | indent 8 }} {{- $omitResources := hasKey $.Values.global "omitResources" | ternary $.Values.global.omitResources $.Values.global.privileged }} {{- if not $omitResources }} -{{- include "hpcc.addStubResources" ($commonCtx | merge (dict "instances" 1)) | indent 8 }} +{{- $defaultResources := dict "cpu" "500m" "memory" "200Mi" }} +{{- include "hpcc.addResources" (dict "me" .topoResources "defaults" $defaultResources) | indent 8 }} {{- end }} {{ include "hpcc.addImageAttrs" $commonCtx | indent 8 }} workingDir: /var/lib/HPCCSystems diff --git a/helm/hpcc/templates/thor.yaml b/helm/hpcc/templates/thor.yaml index 5d8a220401e..5b2f94e7be3 100644 --- a/helm/hpcc/templates/thor.yaml +++ b/helm/hpcc/templates/thor.yaml @@ -395,7 +395,7 @@ spec: {{- if $commonCtx.eclAgentUseChildProcesses }} {{- include "hpcc.addResources" (dict "me" .eclAgentResources) | indent 8 }} {{- else }} -{{- include "hpcc.addStubResources" ($commonCtx | merge (dict "instances" .maxJobs)) | indent 8 }} +{{- include "hpcc.addStubResources" ($commonCtx | merge (dict "stubResources" .stubResources)) | indent 8 }} {{- end }} {{- end }} {{ include "hpcc.addImageAttrs" $commonCtx | indent 8 }} @@ -458,7 +458,7 @@ spec: {{- include "hpcc.addSecurityContext" $commonCtx | indent 8 }} {{- $omitResources := hasKey $.Values.global "omitResources" | ternary $.Values.global.omitResources $.Values.global.privileged }} {{- if not $omitResources }} -{{- include "hpcc.addStubResources" ($commonCtx | merge (dict "instances" .maxGraphs)) | indent 8 }} +{{- include "hpcc.addStubResources" ($commonCtx | merge (dict "stubResources" .stubResources)) | indent 8 }} {{- end }} {{ include "hpcc.addImageAttrs" $commonCtx | indent 8 }} volumeMounts: diff --git a/helm/hpcc/values.schema.json b/helm/hpcc/values.schema.json index 6393494a873..4de707b13a0 100644 --- a/helm/hpcc/values.schema.json +++ b/helm/hpcc/values.schema.json @@ -1427,6 +1427,9 @@ "resources": { "$ref": "#/definitions/resources" }, + "timedChildResources": { + "$ref": "#/definitions/resources" + }, "cost": { "$ref" : "#/definitions/componentCost" }, @@ -1613,6 +1616,9 @@ "resources": { "$ref": "#/definitions/resources" }, + "stubResources": { + "$ref": "#/definitions/resources" + }, "jobMemory": { "$ref": "#/definitions/memory" }, @@ -1721,6 +1727,9 @@ "channelResources": { "$ref": "#/definitions/resources" }, + "topoResources": { + "$ref": "#/definitions/resources" + }, "annotations": { "type": "object", "additionalProperties": { "type": "string" } @@ -2593,6 +2602,9 @@ "eclAgentResources": { "$ref": "#/definitions/resources" }, + "stubResources": { + "$ref": "#/definitions/resources" + }, "cost": { "$ref" : "#/definitions/componentCost" }, diff --git a/testing/helm/tests/resourced.yaml b/testing/helm/tests/resourced.yaml new file mode 100644 index 00000000000..a8d3a0053e6 --- /dev/null +++ b/testing/helm/tests/resourced.yaml @@ -0,0 +1,867 @@ +# Default values for hpcc. + +global: + # Settings in the global section apply to all HPCC components in all subcharts + + image: + ## It is recommended to name a specific version rather than latest, for any non-trivial deployment + ## For best results, the helm chart version and platform version should match, which is the default if version is + ## not specified. Do not override without good reason as undefined behavior may result. + ## version: x.y.z + root: "hpccsystems" # change this if you want to pull your images from somewhere other than DockerHub hpccsystems + pullPolicy: IfNotPresent + ## If you need to provide credentials to pull your image, they should be added as a k8s secret, and the secret name provided here + # imagePullSecrets: xxx + + ## busybox image is used for some initialization/termination tasks - you can override the location here + #busybox: "myrepo/busybox:stable" + + ## It is possible (but not recommended) to change the uid/gid that the HPCC containers run under + ## user: + ## uid: 10000 + ## gid: 10001 + + # logging sets the default logging information for all components. Can be overridden locally + logging: + detail: 80 + + # tracing sets the default tracing information for all components. Can be overridden locally + tracing: + disabled: false + alwaysCreateTraceIds: true + + ## resource settings for stub components + #stubInstanceResources: + # memory: "200Mi" + # cpu: "20m" + + ## env adds default environment variables for all components. Environment settings can also be added or overridden locally + #env: + #- name: SMTPserver + # value: mysmtpserver + + # Specify a defaultEsp to control which eclservices service is returned from Std.File.GetEspURL, and other uses + # If not specified, the first esp component that exposes eclservices application is assumed. + # Can also be overridden locally in individual components + ## defaultEsp: eclservices + + egress: + ## If restricted is set, NetworkPolicies will include egress restrictions to allow connections from pods only to the minimum required by the system + ## Set to false to disable all egress policy restrictions (not recommended) + restricted: true + + ## The kube-system namespace is not generally labelled by default - to enable more restrictive egress control for dns lookups we need to be told the label + ## If not provided, DNS lookups on port 53 will be allowed to connect anywhere + ## The namespace may be labelled using a command such as "kubectl label namespace kube-system name=kube-system" + # kubeSystemLabel: "kube-system" + + ## To properly allow access to the kubectl API from pods that need it, the cidr of the kubectl endpoint needs to be supplied + ## This may be obtained via "kubectl get endpoints --namespace default kubernetes" + ## If these are not supplied, egress controls will allow access to any IPs/ports from any pod where API access is needed + # kubeApiCidr: 172.17.0.3/32 + # kubeApiPort: 7443 + + ## named egress sections defined here, can be referenced by components, or they can define their own egress section explicitly + #engineEgress: + #- to: + # - ipBlock: + # cidr: 10.9.8.7/32 + # ports: + # - protocol: TCP + # port: 443 + + + cost: + currencyCode: USD + # The following are example pricing based on standard Azure pricing and should be updated to reflect actual rates + perCpu: 0.0565000000001 # D64ds_v4 compute node ($2,639.68/month for 64 vCPU) + storageAtRest: 0.0208000000001 # Blob storage pricing (East US/Flag NS/LRS redundancy/Hot) + storageReads: 0.00400000000001 # Blob storage pricing (East US/Flag NS/LRS redundancy/Hot) + storageWrites: 0.0500000000001 # Blob storage pricing (East US/Flag NS/LRS redundancy/Hot) + + # postJobCommand will execute at the end of a dynamically launched K8s job, + # when the main entrypoint process finishes, or if the readiness probes trigger a preStop event. + # This can be useful if injected sidecars are installed that need to be told to stop. + # If they are not stopped, the pod continues running with the side car container only, in a "NotReady" state. + # An example of this is the Istio envoy side car. It can be stopped with the command below. + # Set postJobCommandViaSidecar to true, if the command needs to run with privilege, this will enable the command + # to run as root in a sidecar in same process space as other containers, allowing it to for example send signals + # to processes in sidecars + # misc: + # postJobCommand: "curl -sf -XPOST http://127.0.0.1:15020/quitquitquit" + # Or example for linkerd + # postJobCommand: "kill $(pgrep linkerd2-proxy)" + # postJobCommandViaSidecar: true + + ## visibilities section can be used to set labels, annotations and service type for any service with the specified visibility + visibilities: + cluster: + type: ClusterIP + local: + annotations: + # This annotation will make azure load balancer use an internal rather than an internet-visible address + # May want different values on different cloud providers or use-cases. For example on AWS you may want to use + #service.beta.kubernetes.io/aws-load-balancer-internal: "true" + service.beta.kubernetes.io/azure-load-balancer-internal: "true" + type: LoadBalancer + # If ingress is specified, an ingress Network Policy will be created for any pod implementing a service with this visibility + # Default allows ingress from anywhere, but more restrictive rules can be used if preferred. + # Ingress rules can also be overridden by individual services + ingress: + - {} + global: + #labels: + # mylabel: "4" + type: LoadBalancer + ingress: + - {} + ## CIDRS allowed to access this service. + #loadBalancerSourceRanges: [1.2.3.4/32, 5.6.7.8/32] + + # example expert section. The sysctl list will be applied to each pod in a privileged init container + # expert: + # sysctl: + # - kernel.dmesg_restrict=0 + +# For pod placement instruction and examples please reference docs/placements.md +# The following is for tolerations of Spot Node Pool on Azure. Other cloud providers +# may have different taints for Spot Node Pool. The tolerations are harmless when +# there is no taint on the node pool. +#placements: +# - pods: ["all"] +# placement: +# tolerations: +# - key: "kubernetes.azure.com/scalesetpriority" +# operator: "Equal" +# value: "spot" +# effect: "NoSchedule" + +security: + eclSecurity: + # Possible values: + # allow - functionality is permitted + # deny - functionality is not permitted + # allowSigned - functionality permitted only if code signed + embedded: "allow" + pipe: "allow" + extern: "allow" + datafile: "allow" + +## storage: +## +## 1. If an engine component has the dataPlane property set, then that plane will be the default data location for that component. +## 2. If there is a plane definition with a category of "data" then the first matching plane will be the default data location +## +## If a data plane contains the storageClass property then an implicit pvc will be created for that data plane. +## +## If plane.pvc is defined, a Persistent Volume Claim must exist with that name, storageClass and storageSize are not used. +## +## If plane.storageClass is defined, storageClassName: +## If set to "-", storageClassName: "", which disables dynamic provisioning +## If set to "", choosing the default provisioner. (gp2 on AWS, standard on GKE, AWS & OpenStack) +## +## plane.forcePermissions=true is required by some types of provisioned +## storage, where the mounted filing system has insufficient permissions to be +## read by the hpcc pods. Examples include using hostpath storage (e.g. on +## minikube and docker for desktop), or using NFS mounted storage. + +storage: + planes: + # name: + # prefix: # Root directory for accessing the plane (if pvc defined), or url to access plane. + # category: data|dali|lz|dll|spill|temp # What category of data is stored on this plane? + # + # For dynamic pvc creation: + # storageClass: '' + # storageSize: 1Gi + # + # For persistent storage: + # pvc: # The name of the persistant volume claim + # forcePermissions: false + # hosts: [ ] # Inline list of hosts + # hostGroup: # Name of the host group for bare metal - must match the name of the storage plane.. + # + # Other options: + # subPath: # Optional sub directory within to use as the root directory + # numDevices: 1 # number of devices that are part of the plane + # secret: # what secret is required to access the files. This could optionally become a list if required (or add secrets:). + # defaultSprayParts: 4 # The number of partitions created when spraying (default: 1) + # eclwatchVisible: true # Can the lz plane be visible from ECLWatch (default: true) + # cost: # The storage cost + # storageAtRest: 0.0135 # Storage at rest cost: cost per GiB/month + # storageapi: # Optional information to allow access to storage api + # type: azurefile | azureblob + # account: # azure storage account name + # secret: # secret name (under secrets/storage) for accessing SAS token + # containers: [ ] # a list of containers + + - name: dali + storageClass: "" + storageSize: 1Gi + prefix: "/var/lib/HPCCSystems/dalistorage" + category: dali + - name: sasha + storageClass: "" + storageSize: 1Gi + prefix: "/var/lib/HPCCSystems/sashastorage" + category: sasha + - name: dll + storageClass: "" + storageSize: 1Gi + prefix: "/var/lib/HPCCSystems/queries" + category: dll + - name: data + storageClass: "" + storageSize: 1Gi + prefix: "/var/lib/HPCCSystems/hpcc-data" + category: data + - name: mydropzone + storageClass: "" + storageSize: 1Gi + prefix: "/var/lib/HPCCSystems/mydropzone" + category: lz + - name: debug + disabled: False + storageClass: "" + storageSize: 1Gi + prefix: "/var/lib/HPCCSystems/debug" + category: debug + +## The certificates section can be used to enable cert-manager to generate TLS certificates for each component in the hpcc. +## You must first install cert-manager to use this feature. +## https://cert-manager.io/docs/installation/kubernetes/#installing-with-helm +## +## The Certificate issuers are divided into "local" (those which will be used for local mutual TLS) and "public" those +## which will be publicly accessible and therefore need to be recognized by browsers and/or other entities. +## +## Both public and local issuers have a spec section. The contents of the "spec" are documented in the cert-manager +## "Issuer configuration" documentation. https://cert-manager.io/docs/configuration/#supported-issuer-types +## +## The default configuration is meant to provide reasonable functionality without additional dependencies. +## +## Public issuers can be tricky if you want browsers to recognize the certificates. This is a complex topic outside the scope +## of this comment. The default for the public issuer generates self signed certificates. The expectation is that this will be +## overridden by the configuration of an external certificate authority or vault in QA and production environments. +## +## The default for the local (mTLS) issuer is designed to act as our own local certificate authority. We only need to recognize +## what a component is, and that it belongs to this cluster. +## But a kubernetes secret must be provided for the certificate authority key-pair. The default name for the secret +## is "hpcc-local-issuer-key-pair". The secret is a standard kubernetes.io/tls secret and should provide data values for +## "tls.crt" and "tls.key". +## +## The local issuer can also be configured to use an external certificate authority or vault. +## +certificates: + enabled: false + issuers: + local: + name: hpcc-local-issuer + ## kind can be changed to ClusterIssue to refer to a ClusterIssuer. https://cert-manager.io/docs/reference/api-docs/#cert-manager.io/v1.ClusterIssuer + kind: Issuer + ## do not define spec (set spec: null), to reference an Issuer resource that already exists in the cluster + ## change spec if you'd like to change how certificates get issued... see ## https://cert-manager.io/docs/configuration/#supported-issuer-types + ## for information on what spec should contain. + spec: + ca: + secretName: hpcc-local-issuer-key-pair + public: + name: hpcc-public-issuer + ## kind can be changed to ClusterIssue to refer to a ClusterIssuer. https://cert-manager.io/docs/reference/api-docs/#cert-manager.io/v1.ClusterIssuer + kind: Issuer + ## do not define spec (set spec: null), to reference an Issuer resource that already exists in the cluster + ## change spec if you'd like to change how certificates get issued... see ## https://cert-manager.io/docs/configuration/#supported-issuer-types + ## for information on what spec should contain. + spec: + selfSigned: {} + vaultclient: + name: hpcc-vaultclient-issuer + enabled: false + ## domain: hpcc.example.com + rolePrefix: "hpcc-" + kind: Issuer + ## do not define spec (set spec: null), to reference an Issuer resource that already exists in the cluster + ## change spec if you'd like to change how certificates get issued... see ## https://cert-manager.io/docs/configuration/#supported-issuer-types + ## for information on what spec should contain. + spec: + ca: + secretName: hpcc-vaultclient-issuer-key-pair + remote: + name: hpcc-remote-issuer + ## set enabled to true if adding remoteClients for any components + enabled: false + ## kind can be changed to ClusterIssue to refer to a ClusterIssuer. https://cert-manager.io/docs/reference/api-docs/#cert-manager.io/v1.ClusterIssuer + kind: Issuer + ## do not define spec (set spec: null), to reference an Issuer resource that already exists in the cluster + ## change spec if you'd like to change how certificates get issued... see ## https://cert-manager.io/docs/configuration/#supported-issuer-types + ## for information on what spec should contain. + spec: + ca: + secretName: hpcc-remote-issuer-key-pair + signing: # intended to be used for signing/verification purposes only, e.g. by dafilesrv + name: hpcc-signing-issuer + ## kind can be changed to ClusterIssue to refer to a ClusterIssuer. https://cert-manager.io/docs/reference/api-docs/#cert-manager.io/v1.ClusterIssuer + kind: Issuer + ## do not define spec (set spec: null), to reference an Issuer resource that already exists in the cluster + ## change spec if you'd like to change how certificates get issued... see ## https://cert-manager.io/docs/configuration/#supported-issuer-types + ## for information on what spec should contain. + spec: + ca: + secretName: hpcc-signing-issuer-key-pair + +## The secrets section contains a set of categories, each of which contain a list of secrets. The categories determine which +## components have access to the secrets. +## For each secret: +## name is the name that it is accessed by within the platform +## secret is the name of the secret that should be published +secrets: + #timeout: 300 # timeout period for cached secrets. Should be similar to the k8s refresh period. + + #Secret categories follow, remove the {} if a secret is defined in a section + storage: {} + ## Secrets that are required for accessing storage. Currently exposed in the engines, but in the future will + ## likely be restricted to esp (when it becomes the meta-data provider) + ## For example, to set the secret associated with the azure storage account "mystorageaccount" use + ##azure-mystorageaccount: storage-myazuresecret + + authn: {} + ## Category to deploy authentication secrets to container, and to create a key name alias to reference those secrets + #ldapadmincredskey: "admincredssecretname" ## Default k/v for LDAP authentication secrets + #testauthusercreds1: "testauthusercreds1" ## Default k/v for test authentication secrets + #testauthusercreds2: "testauthusercreds2" ## Default k/v for test authentication secrets + + ecl: {} + ## Category for secrets published to all components that run ecl. These secrets are for use by internal + ## ECL processing. For example HTTPCALL and SOAPCALL have built in support for secrets that are not directly + ## accessible to users, that is, accessed directly via ECL code. + + eclUser: {} + ## Category for secrets accessible via ecl code. These are secrets that users can access directly. Be cautious about + ## what secrets you add to this category as they are easily accessed by ECL code. + + codeSign: {} + #gpg-private-key-1: codesign-gpg-key-1 + #gpg-private-key-2: codesign-gpg-key-2 + + codeVerify: {} + #gpg-public-key-1: codesign-gpg-public-key-1 + #gpg-public-key-2: codesign-gpg-public-key-2 + + system: {} + ## Category for secrets published to all components for system level useage + + git: {} + ## Category to provide passwords for eclccserver to access private git repos + +## The vaults section mirrors the secret section but leverages vault for the storage of secrets. +## There is an additional category for vaults named "eclUser". "eclUser" vault +## secrets are readable directly from ECL code. Other secret categories are read internally +## by system components and not exposed directly to ECL code. +## +## For each vault: +## name is the name that it is accessed by within the platform +## url is the url used to read a secret from the vault. +## kind is the type of vault being accessed, or the protocol to use to access the secrets +## client_secret a kubernetes level secret that contains the client_token used to retrive secrets. +## if a client_secret is not provided "vault kubernetes auth" will be attempted. + +vaults: + storage: + git: + authn: + ecl: + # vault using vault client certs or kubernetes auth depending on whether certificates.issuers.vaultclient.enabled is true + # to use approle authentication specify appRoleId and appRoleSecret + # - name: my-ecl-vault + #Note the data node in the URL is there for the REST APIs use. The path inside the vault starts after /data + # url: http://${env.VAULT_SERVICE_HOST}:${env.VAULT_SERVICE_PORT}/v1/secret/data/ecl/${secret} + # kind: kv-v2 + # namespace: + eclUser: + # vault using vault client certs or kubernetes auth depending on whether certificates.issuers.vaultclient.enabled is true + # to use approle authentication specify appRoleId and appRoleSecret + # - name: my-eclUser-vault + #Note the data node in the URL is there for the REST APIs use. The path inside the vault starts after /data + # url: http://${env.VAULT_SERVICE_HOST}:${env.VAULT_SERVICE_PORT}/v1/secret/data/eclUser/${secret} + # kind: kv-v2 + esp: + + ## The keys for code signing may be imported from the vault. Multiple keys may be imported. + ## gpg keys may be imported as follows: + ## vault kv put secret/codeSign/gpg-private-key-1 passphrase= private=@ + ## vault kv put secret/codeSign/gpg-private-key-2 passphrase= private=@ + codeSign: + # - name: codesign-private-keys + # url: http://${env.VAULT_SERVICE_HOST}:${env.VAULT_SERVICE_PORT}/v1/secret/data/codeSign/${secret} + # kind: kv-v2 + # namespace: mynamespace # for use with enterprise vaults segmented by namespaces + ## The keys for verifying signed code may be imported from the vault. + ## vault kv put secret/codeVerify/gpg-public-key-1 public=@ + ## vault kv put secret/codeVerify/gpg-public-key-2 public=@ + codeVerify: + # - name: codesign-public-keys + # url: http://${env.VAULT_SERVICE_HOST}:${env.VAULT_SERVICE_PORT}/v1/secret/data/codeVerify/${secret} + # kind: kv-v2 + # namespace: mynamespace # for use with enterprise vaults segmented by namespaces + +bundles: [] +## Specifying bundles here will cause the indicated bundles to be downloaded and installed automatically +## whenever an eclccserver pod is started +# for example +# - name: DataPatterns + +# A dafilesrv 'stream' service is required to expose HPCC file access to 3rd parties (e.g. Spark / Java) +# Access will only be granted to requests that have been signed by the DFUFileAccess service +dafilesrv: +- name: rowservice + disabled: true # disabled by default because requires cert-manager etc. (see certificates section) + application: stream + service: + servicePort: 7600 + visibility: local + +# Enable if bare-metal systems require read access to this systems' data planes via ~remote:: +# If legacy ~foreign:: access is required, Dali will also need to be exposed via a service definition in the dali configuration +# NB: ingress rules should be added to limit access. +- name: direct-access + disabled: true + application: directio + service: + servicePort: 7200 + visibility: local + +- name: spray-service + application: spray + service: + servicePort: 7300 + visibility: cluster + + +dali: +- name: mydali + auth: none + services: # internal house keeping services + coalescer: + service: + servicePort: 8877 + #interval: 2 # (hours) + #at: "* * * * *" # cron type schedule, i.e. Min(0-59) Hour(0-23) DayOfMonth(1-31) Month(1-12) DayOfWeek(0-6) + #minDeltaSize: 50 # (Kb) will not start coalescing until delta log is above this threshold + resources: + cpu: "1" + memory: "10G" + + resources: + cpu: "2" + memory: "20G" + +sasha: + #disabled: true # disable all services. Alternatively set sasha to null (sasha: null) + wu-archiver: + #disabled: true + service: + servicePort: 8877 + plane: sasha + #interval: 6 # (hours) + #limit: 1000 # threshold number of workunits before archiving starts (0 disables) + #cutoff: 8 # minimum workunit age to archive (days) + #backup: 0 # minimum workunit age to backup (days, 0 disables) + #at: "* * * * *" + #duration: 0 # (maxDuration) - Maximum duration to run WorkUnit archiving session (hours, 0 unlimited) + #throttle: 0 # throttle ratio (0-99, 0 no throttling, 50 is half speed) + #retryinterval: 7 # minimal time before retrying archive of failed WorkUnits (days) + #keepResultFiles: false # option to keep result files owned by workunits after workunit is archived + resources: + cpu: "1" + memory: "4Gi" + + dfuwu-archiver: + #disabled: true + service: + servicePort: 8877 + plane: sasha + #forcePermissions: false + #limit: 1000 # threshold number of DFU workunits before archiving starts (0 disables) + #cutoff: 14 # minimum DFU workunit age to archive (days) + #interval: 24 # minimum interval between running DFU recovery archiver (in hours, 0 disables) + #at: "* * * * *" # schedule to run DFU workunit archiver (cron format) + #duration: 0 # (maxDuration) maximum duration to run DFU WorkUnit archiving session (hours, 0 unlimited) + #throttle: 0 # throttle ratio (0-99, 0 no throttling, 50 is half speed) + resources: + cpu: "1" + memory: "4Gi" + + dfurecovery-archiver: + #disabled: true + #limit: 20 # threshold number of DFU recovery items before archiving starts (0 disables) + #cutoff: 4 # minimum DFU recovery item age to archive (days) + #interval: 12 # minimum interval between running DFU recovery archiver(in hours, 0 disables) + #at: "* * * * *" # schedule to run DFU recovery archiver (cron format) + resources: + cpu: "1" + memory: "4Gi" + + file-expiry: + #disabled: true + #interval: 1 + #at: "* 3 * * *" + #persistExpiryDefault: 7 + #expiryDefault: 4 + #user: sasha + resources: + cpu: "1" + memory: "4Gi" + +dfuserver: +- name: dfuserver + maxJobs: 1 + resources: + cpu: "1" + memory: "1800Mi" + +eclagent: +- name: hthor + ## replicas indicates how many eclagent pods should be started + replicas: 1 + ## maxActive controls how many workunits may be active at once (per replica) + maxActive: 4 + ## prefix may be used to set a filename prefix applied to any relative filenames used by jobs submitted to this queue + prefix: hthor + ## Set to false if you want to launch each workunit in its own container, true to run as child processes in eclagent pod + useChildProcesses: false + ## type may be 'hthor' (the default) or 'roxie', to specify that the roxie engine rather than the hthor engine should be used for eclagent workunit processing + type: hthor + ## The following resources apply to child hThor pods when useChildProcesses=false, otherwise they apply to hThor pod. + resources: + cpu: "1" + memory: "1G" + stubResources: + cpu: "100m" + memory: "100Mi" + #egress: engineEgress + +- name: roxie-workunit + replicas: 1 + prefix: roxie_workunit + maxActive: 20 + useChildProcesses: true + type: roxie + #resources: + # cpu: "1" + # memory: "1G" + #egress: engineEgress + resources: + cpu: "1" + memory: "1G" + stubResources: + cpu: "100m" + memory: "100Mi" + +eclccserver: +- name: myeclccserver + replicas: 1 + ## Set to false if you want to launch each workunit compile in its own container, true to run as child processes in eclccserver pod. + useChildProcesses: false + ## If non-zero, and useChildProcesses is false, try spending up to this number of seconds compiling using a child process before switching to + ## a separate container. Speeds up throughput of small jobs. + childProcessTimeLimit: 10 + ## maxActive controls how many workunit compiles may be active at once (per replica) + maxActive: 4 + ## Specify a list of queues to listen on if you don't want this eclccserver listening on all queues. If empty or missing, listens on all queues + listen: [] + ## The following allows eclcc options (names start with a -) and debug options to be defined for each of the workunits that are compiled. + #options: + #- name: globalAutoHoist + # value: false + # cluster: name # optional cluster this is applied to + + # used to configure the authentication for git when using the option to compile from a repo. Also requires an associated secret. + #gitUsername: + + ## The following resources apply to child compile pods when useChildProcesses=false, otherwise they apply to eclccserver pod. + resources: + cpu: "1" + memory: "20Gi" + timedChildResources: + cpu: "1" + memory: "798Mi" + +esp: +- name: eclwatch + ## Pre-configured esp applications include eclwatch, eclservices, and eclqueries + application: eclwatch + auth: none + replicas: 1 + resources: + cpu: "4" + memory: "8G" + ## The following 'corsAllowed' section is used to configure CORS support + ## origin - the origin to support CORS requests from + ## headers - the headers to allow for the given origin via CORS + ## methods - the HTTP methods to allow for the given origin via CORS + ## + #corsAllowed: + ## origin starting with https will only allow https CORS + #- origin: https://*.my.com + # headers: + # - "X-X" + # methods: + # - "GET" + # - "OPTIONS" + ## origin starting with http will allow http or https CORS + #- origin: http://www.example.com + # headers: + # - "*" + # methods: + # - "GET" + # - "POST" + # - "OPTIONS" + +# Add remote clients to generated client certificates and make the ESP require that one of the generated certificates is provided by a client in order to connect +# When setting up remote clients make sure that certificates.issuers.remote.enabled is set to true. +# remoteClients: +# - name: petfoodapplicationprod +# organization: petfoodDept +# secretTemplate: +# annotations: +# kubed.appscode.com/sync: "hpccenv=petfoodAppProd" # use kubed config-syncer to replicate certificate to namespace with matching annotation (also supports syncing with separate aks clusters) + +# trustClients and remoteClients can be combined. Trust is far easier to manage and should now be the preferred mechanism. +# Trust is similar to remoteClients, but unlike remoteClients, the client certificates are generated elsewhere. +# If trust is present then esp will use mtls, with trust controlled by certificates.issuers.remote, which must be enabled. +# When using trustClients the remote issuer of each environment should point to the same certifate authority. +# Verification of identity is automatic if the CA matches, but only the clients listed here are actually allowed access +# trustClients: +# - commonName: rabc.example.com + + service: + ## port can be used to change the local port used by the pod. If omitted, the default port (8880) is used + port: 8888 + ## servicePort controls the port that this service will be exposed on, either internally to the cluster, or externally + servicePort: 8010 + ## wsdlAddress should be set to the host and port which clients can use to hit this service. + # This address is added to the service wsdl files which simplify setting up a SOAP client to hit this service. There may be many external factors determining the address + # that is accible to clients. + # wsdlAddress: clientfacingaddress:8010 + ## Specify visibility: local (or global) if you want the service available from outside the cluster. Typically, eclwatch and wsecl are published externally, while eclservices is designed for internal use. + visibility: local + ## Annotations can be specified on a service - for example to specify provider-specific information such as service.beta.kubernetes.io/azure-load-balancer-internal-subnet + #annotations: + # service.beta.kubernetes.io/azure-load-balancer-internal-subnet: "mysubnet" + # The service.annotations prefixed with hpcc.eclwatch.io should not be declared here. They can be declared + # in other services in order to be exposed in the ECLWatch interface. Similar function can be used by other + # applications. For other applications, the "eclwatch" inside the service.annotations should be replaced by + # their application names. + # hpcc.eclwatch.io/enabled: "true" + # hpcc.eclwatch.io/description: "some description" + ## You can also specify labels on a service + #labels: + # mylabel: "3" + ## Links specify the web links for a service. The web links may be shown on ECLWatch. + #links: + #- name: linkname + # description: "some description" + # url: "http://abc.com/def?g=1" + ## CIDRS allowed to access this service. + #loadBalancerSourceRanges: [1.2.3.4/32, 5.6.7.8/32] + # Increase maxRequestEntityLength when query deployments (or similar actions) start to fail because they surpass the maximum size + # default for EclWatch is 60M, default for other services is 8M + #maxRequestEntityLength: 70M + #resources: + # cpu: "1" + # memory: "2G" +- name: eclservices + application: eclservices + auth: none + replicas: 1 + service: + servicePort: 8010 + visibility: cluster + # Increase maxRequestEntityLength when query deployments (or similar actions) start to fail because they surpass the maximum size + # default for EclWatch is 60M, default for other services is 8M + #maxRequestEntityLength: 9M + #resources: + # cpu: "250m" + # memory: "1G" +- name: eclqueries + application: eclqueries + auth: none + replicas: 1 + service: + visibility: local + servicePort: 8002 + #annotations: + # hpcc.eclwatch.io/enabled: "true" + # hpcc.eclwatch.io/description: "Roxie Test page" + # hpcc.eclwatch.io/port: "8002" + # Increase maxRequestEntityLength when query deployments (or similar actions) start to fail because they surpass the maximum size + # default for EclWatch is 60M, default for other services is 8M + #maxRequestEntityLength: 9M + #resources: + # cpu: "250m" + # memory: "1G" +- name: esdl-sandbox + application: esdl-sandbox + auth: none + replicas: 1 + service: + visibility: local + servicePort: 8899 + # Increase maxRequestEntityLength when query deployments (or similar actions) start to fail because they surpass the maximum size + # default for EclWatch is 60M, default for other services is 8M + #maxRequestEntityLength: 9M + #resources: + # cpu: "250m" + # memory: "1G" +- name: sql2ecl + application: sql2ecl + auth: none + replicas: 1 + service: + visibility: local + servicePort: 8510 + #domain: hpccsql.com + # Increase maxRequestEntityLength when query deployments (or similar actions) start to fail because they surpass the maximum size + # default for EclWatch is 60M, default for other services is 8M + #maxRequestEntityLength: 9M + #resources: + # cpu: "250m" + # memory: "1G" +- name: dfs + application: dfs + auth: none + replicas: 1 + service: + visibility: local + servicePort: 8520 + # Increase maxRequestEntityLength when query deployments (or similar actions) start to fail because they surpass the maximum size + # default for EclWatch is 60M, default for other services is 8M + #maxRequestEntityLength: 9M + #resources: + # cpu: "250m" + # memory: "1G" + + +#- name: ldapenvironment + #ldapenvironment is a stand alone ESP service used to help stand up new HPCC LDAP Environments +# application: ldapenvironment +# auth: ldap +# #specify the hpcc branch Root Name +# hpccRootName: ou=hpcc,dc=myldap,dc=com +# #specify all BaseDN with your LDAP Server's "dc=" settings +# sharedFilesBaseDN: ou=files,ou=hpcc,dc=myldap,dc=com +# sharedGroupsBaseDN: ou=groups,ou=hpcc,dc=myldap,dc=com +# sharedUsersBaseDN: ou=users,ou=hpcc,dc=myldap,dc=com +# sharedResourcesBaseDN: ou=smc,ou=espservices,ou=hpcc,dc=myldap,dc=com +# sharedWorkunitsBaseDN: ou=workunits,ou=hpcc,dc=myldap,dc=com +# adminGroupName: HPCCAdmins +# replicas: 1 +# service: +# visibility: local +# servicePort: 8511 + +roxie: +- name: roxie + disabled: false + prefix: roxie + services: + - name: roxie + servicePort: 9876 + listenQueue: 200 + numThreads: 30 + visibility: local +# trustClients: +# - commonName: rabc.example.com +# - commonName: rbcd.example.com + # Can override ingress rules for each service if desired - for example to add no additional ingress permissions you can use + # ingress: [] + +# Trust is similar to remoteClients, but unlike remoteClients, the client certificates are generated elsewhere. +# If trust is present then roxie will use mtls with trust controlled by certificates.issuer.remote. +# Using the trust section the remote issuer of each environment should point to the same certifate authority. +# Verification of identity is automatic if the CA matches, but only the clients listed here are actually allowed access +# trust: +# - commonName: abc.example.com +# - commonName: bcd.example.com + + ## replicas indicates the number of replicas per channel + replicas: 2 + numChannels: 2 + ## Set singleNode to true for a scalable cluster of "single-node" roxie servers, each implementing all channels locally + singleNode: false + ## Adjust traceLevel to taste (1 is default) + traceLevel: 1 + ## set totalMemoryLimit to indicate how much memory is preallocated for roxie row data + # totalMemoryLimit: "1Gi" # Default 1Gi, capped to 75% of resources.memory if defined. + ## Set mtuPayload to the maximum amount of data Roxie will put in a single packet. This should be just less than the system MTU. Default is 1400 + # mtuPayload: 3800 + + ## resources specifies the resources required by each agent pod + resources: + cpu: "8" + memory: "12G" + topoResources: + cpu: "789m" + memory: "543Mi" + serverResources: + cpu: "2" + memory: "8G" + channelResources: + cpu: "4" + memory: "6Gi" + + ## Set serverReplicas to indicate a separate replicaSet of roxie servers, with agent pods not acting as servers + serverReplicas: 0 + ## If serverReplicas is set, the resources required for the server pods can be configured separately from the agent (channel) pods + #serverResources: + # cpu: "1" + # memory: "4Gi" + #channelResources: + # cpu: "2" + # memory: "8Gi" + + # Roxie may take a while to start up if there are a lot of queries to load. Yuo may need to + #override the default startup/readiness probing by setting these values + #minStartupTime: 30 # How long to wait before initiating startup probing + #maxStartupTime: 600 # Maximum time to wait for startup to complete before failing + topoServer: + replicas: 1 + #directAccessPlanes: [] #add direct access planes that roxie will read from without copying the data to its default data plane + #ldapUser: roxie_file_access #add system username for accessing files + #egress: engineEgress + +## The [manager/worker/eclAgent]Resources define the resource limits for each container. +## If numWorkersPerPod is >1 (must be a factor of numWorkers). +## NB: Each worker corresponds to a container, that will be resourced according to +## workerResources, meaning that if numWorkersPerPod>1, N * workerResources.cpu, +## N * workerResources.memory etc., will be required in total for the pod. +## +## By default the available Thor memory will be based on the resourced container memory. +## This can be overriden by setting [worker/manager]Memory.query and +## [worker/manager]Memory.thirdParty. +thor: +- name: thor + prefix: thor + numWorkers: 2 + maxJobs: 4 + maxGraphs: 2 + #maxGraphStartupTime: 600 + #numWorkersPerPod: 1 + managerResources: + cpu: "1" + memory: "2G" + workerResources: + cpu: "4" + memory: "4G" + #workerMemory: + # query: "3G" + # thirdParty: "500M" + eclAgentResources: + cpu: "1" + memory: "432M" + #egress: engineEgress + +eclscheduler: +- name: eclscheduler + resources: + cpu: "567m" + memory: "4321M" From 2fcc45f9c69abe04eb510befc1ebbe6ea0b73b31 Mon Sep 17 00:00:00 2001 From: Michael Gardner Date: Mon, 22 Apr 2024 11:10:30 -0400 Subject: [PATCH 40/44] HPCC-31658 Change ALL_HPCC_DOCS to use version instead of community_tag Signed-off-by: Michael Gardner --- .github/workflows/build-assets.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-assets.yml b/.github/workflows/build-assets.yml index 6838b6699a0..195034d0efc 100644 --- a/.github/workflows/build-assets.yml +++ b/.github/workflows/build-assets.yml @@ -221,10 +221,10 @@ jobs: sudo rm -f ${{ needs.preamble.outputs.folder_build }}/CMakeCache.txt sudo rm -rf ${{ needs.preamble.outputs.folder_build }}/CMakeFiles docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_build }} ${{ steps.vars.outputs.docker_tag_candidate_base }} "\ - cmake -S /hpcc-dev/HPCC-Platform -B /hpcc-dev/build -DMAKE_DOCS_ONLY=ON -DUSE_NATIVE_LIBRARIES=ON -DDOCS_AUTO=ON -DDOC_LANGS=ALL && \ + cmake -S /hpcc-dev/HPCC-Platform -B /hpcc-dev/build -DVCPKG_FILES_DIR=/hpcc-dev -DMAKE_DOCS_ONLY=ON -DUSE_NATIVE_LIBRARIES=ON -DDOCS_AUTO=ON -DDOC_LANGS=ALL && \ cmake --build /hpcc-dev/build --parallel $(nproc) --target all" - docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_build }} ${{ steps.vars.outputs.docker_tag_candidate_base }} "cd /hpcc-dev/build/Release/docs/EN_US && zip ALL_HPCC_DOCS_EN_US-${{ needs.preamble.outputs.community_tag }}.zip *.pdf" - docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_build }} ${{ steps.vars.outputs.docker_tag_candidate_base }} "cd /hpcc-dev/build/Release/docs/PT_BR && zip ALL_HPCC_DOCS_PT_BR-${{ needs.preamble.outputs.community_tag }}.zip *.pdf" + docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_build }} ${{ steps.vars.outputs.docker_tag_candidate_base }} "cd /hpcc-dev/build/Release/docs/EN_US && zip ALL_HPCC_DOCS_EN_US-$(echo '${{ needs.preamble.outputs.community_tag }}' | sed 's/community_//' ).zip *.pdf" + docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_build }} ${{ steps.vars.outputs.docker_tag_candidate_base }} "cd /hpcc-dev/build/Release/docs/PT_BR && zip ALL_HPCC_DOCS_PT_BR-$(echo '${{ needs.preamble.outputs.community_tag }}' | sed 's/community_//' ).zip *.pdf" - name: Upload Assets (community) if: ${{ !matrix.ln }} From 1567d6171676da861c6b0091c64b673448a0563a Mon Sep 17 00:00:00 2001 From: "Dan S. Camper" Date: Tue, 23 Apr 2024 13:44:15 -0500 Subject: [PATCH 41/44] HPCC-31672 Update Std.DataPatterns.Profile to version 1.9.4 Uses short form of Unicode property names for regex statements. --- ecllibrary/std/DataPatterns/Profile.ecl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ecllibrary/std/DataPatterns/Profile.ecl b/ecllibrary/std/DataPatterns/Profile.ecl index 49c9f834dcf..65643ed6317 100644 --- a/ecllibrary/std/DataPatterns/Profile.ecl +++ b/ecllibrary/std/DataPatterns/Profile.ecl @@ -615,9 +615,9 @@ EXPORT Profile(inFile, // Pattern mapping a UNICODE datatype; using regex due to the complexity // of the character set #UNIQUENAME(_MapUpperCharUni); - LOCAL %_MapUpperCharUni%(UNICODE s) := REGEXREPLACE(u'\\p{Uppercase_Letter}', s, u'A'); + LOCAL %_MapUpperCharUni%(UNICODE s) := REGEXREPLACE(u'\\p{Lu}', s, u'A'); #UNIQUENAME(_MapLowerCharUni); - LOCAL %_MapLowerCharUni%(UNICODE s) := REGEXREPLACE(u'[[\\p{Lowercase_Letter}][\\p{Titlecase_Letter}][\\p{Modifier_Letter}][\\p{Other_Letter}]]', s, u'a'); + LOCAL %_MapLowerCharUni%(UNICODE s) := REGEXREPLACE(u'[[\\p{Ll}][\\p{Lt}][\\p{Lm}][\\p{Lo}]]', s, u'a'); #UNIQUENAME(_MapDigitUni); LOCAL %_MapDigitUni%(UNICODE s) := REGEXREPLACE(u'[1-9]', s, u'9'); // Leave '0' as-is and replace with '9' later #UNIQUENAME(_MapAllUni); From 96bbb265df36e641b00d98e6f709274baea7aef2 Mon Sep 17 00:00:00 2001 From: Jake Smith Date: Thu, 25 Apr 2024 09:53:33 +0100 Subject: [PATCH 42/44] HPCC-31689 Add checkfilesize to daliadmin Add a command ('checkFileSize'), that given a logical filename or a mask, scans logical files for parts with missing @size attributes, reports them, and optionally fixes them. See HPCC-31662 for background. Signed-off-by: Jake Smith --- dali/daliadmin/daadmin.cpp | 95 ++++++++++++++++++++++++++++++++++++ dali/daliadmin/daadmin.hpp | 1 + dali/daliadmin/daliadmin.cpp | 56 ++++++++++++--------- 3 files changed, 128 insertions(+), 24 deletions(-) diff --git a/dali/daliadmin/daadmin.cpp b/dali/daliadmin/daadmin.cpp index 26954d26776..f3f25fad57b 100644 --- a/dali/daliadmin/daadmin.cpp +++ b/dali/daliadmin/daadmin.cpp @@ -2264,6 +2264,101 @@ void getxref(const char *dst) conn->close(); } +void checkFileSizeOne(IUserDescriptor *user, const char *lfn, bool fix) +{ + try + { + CDfsLogicalFileName dlfn; + dlfn.set(lfn); + Owned dFile = queryDistributedFileDirectory().lookup(dlfn, user, AccessMode::tbdRead, false, false, nullptr, defaultPrivilegedUser, 30000); // 30 sec timeout + if (dFile) + { + if (dFile->querySuperFile()) + WARNLOG("Skipping: file '%s' is a superfile", lfn); + else + { + bool fileLocked = false; + COnScopeExit ensureFileUnlock([&]() { if (fileLocked) dFile->unlockProperties(); }); + unsigned numParts = dFile->numParts(); + for (unsigned p=0; pqueryPart(p); + IPropertyTree &attrs = part.queryAttributes(); + if (!attrs.hasProp("@size")) + { + if (fix) + { + offset_t partSize; + try + { + partSize = part.getFileSize(true, true); + if (!fileLocked) + { + // we lock the file once, so that the individual part lock/unlocks are effectively a NOP + dFile->lockProperties(30000); + fileLocked = true; + PROGLOG("File '%s' has missing @size attributes", lfn); + } + part.lockProperties(30000); + } + catch (IException *e) + { + EXCLOG(e); + e->Release(); + continue; + } + COnScopeExit ensurePartUnlock([&]() { part.unlockProperties(); }); + PROGLOG("Part %u: Setting @size to %" I64F "u", p+1, partSize); + attrs.setPropInt64("@size", partSize); + } + else + PROGLOG("File '%s' missing @size on part %u", lfn, p+1); + } + } + } + } + else + WARNLOG("File '%s' not found", lfn); + } + catch (IException *e) + { + EXCLOG(e); + e->Release(); + } +} + +void checkFileSize(IUserDescriptor *user, const char *lfnPattern, bool fix) +{ + if (containsWildcard(lfnPattern)) + { + unsigned count = 0; + Owned iter = queryDistributedFileDirectory().getDFAttributesIterator(lfnPattern, user, true, false); // no supers + CCycleTimer timer; + if (iter->first()) + { + while (true) + { + IPropertyTree &attr = iter->query(); + const char *lfn = attr.queryProp("@name"); + checkFileSizeOne(user, lfn, fix); + ++count; + + if (!iter->next()) + break; + else if (timer.elapsedCycles() >= queryOneSecCycles()*10) // log every 10 secs + { + PROGLOG("Processed %u files", count); + timer.reset(); + } + } + } + PROGLOG("Total files processed %u files", count); + } + else + checkFileSizeOne(user, lfnPattern, fix); +} + + struct CTreeItem : public CInterface { String *tail; diff --git a/dali/daliadmin/daadmin.hpp b/dali/daliadmin/daadmin.hpp index 7a86e86ab30..687d0d882b2 100644 --- a/dali/daliadmin/daadmin.hpp +++ b/dali/daliadmin/daadmin.hpp @@ -73,6 +73,7 @@ extern DALIADMIN_API void listmatches(const char *path, const char *match, const extern DALIADMIN_API void dfsreplication(const char *clusterMask, const char *lfnMask, unsigned redundancy, bool dryRun); extern DALIADMIN_API void migrateFiles(const char *srcGroup, const char *tgtGroup, const char *filemask, const char *_options); extern DALIADMIN_API void getxref(const char *dst); +extern DALIADMIN_API void checkFileSize(IUserDescriptor *user, const char *lfnPattern, bool fix); extern DALIADMIN_API void listworkunits(const char *test, const char *min, const char *max); extern DALIADMIN_API void workunittimings(const char *wuid); diff --git a/dali/daliadmin/daliadmin.cpp b/dali/daliadmin/daliadmin.cpp index 26c002fbb0f..0491b7d42f1 100644 --- a/dali/daliadmin/daliadmin.cpp +++ b/dali/daliadmin/daliadmin.cpp @@ -55,34 +55,35 @@ void usage(const char *exe) printf(" count -- counts xpath matches\n"); printf("\n"); printf("Logical File meta information commands:\n"); - printf(" dfsfile -- get meta information for file\n"); - printf(" dfsmeta -- get new meta information for file\n"); - printf(" setdfspartattr [] -- set attribute of a file part to value, or delete the attribute if not provided\n"); - printf(" dfspart -- get meta information for part num\n"); + printf(" checksuperfile [fix=true|false] -- check superfile links consistent and optionally fix\n"); + printf(" checksubfile -- check subfile links to parent consistent\n"); + printf(" checkfilesize [fix=true|false] -- check file size attributes and optionally fix"); + printf(" cleanscopes -- remove empty scopes\n"); + printf(" clusternodes [filename] -- get IPs for cluster group. Written to optional filename if provided\n"); printf(" dfscheck -- verify dfs file information is valid\n"); + printf(" dfscompratio -- returns compression ratio of file\n"); printf(" dfscsv -- get csv info. for files matching mask\n"); + printf(" dfsexists -- sets return value to 0 if file exists\n"); + printf(" dfsfile -- get meta information for file\n"); printf(" dfsgroup [filename] -- get IPs for logical group (aka cluster). Written to optional filename if provided\n"); - printf(" clusternodes [filename] -- get IPs for cluster group. Written to optional filename if provided\n"); printf(" dfsls [] [options]-- get list of files within a scope (options=lrs)\n"); printf(" dfsmap -- get part files (primary and replicates)\n"); - printf(" dfsexists -- sets return value to 0 if file exists\n"); + printf(" dfsmeta -- get new meta information for file\n"); printf(" dfsparents -- list superfiles containing file\n"); + printf(" dfspart -- get meta information for part num\n"); + printf(" dfsperm -- returns LDAP permission for file\n"); + printf(" dfsreplication [dryrun] -- set redundancy for files matching mask, on specified clusters only\n"); + printf(" dfsscopes -- lists logical scopes (mask = * for all)\n"); printf(" dfsunlink -- unlinks file from all super parents\n"); printf(" dfsverify -- verifies parts exist, returns 0 if ok\n"); - printf(" setprotect -- overwrite protects logical file\n"); - printf(" unprotect -- unprotect (if id=* then clear all)\n"); - printf(" listprotect -- list protected files\n"); - printf(" checksuperfile [fix=true|false] -- check superfile links consistent and optionally fix\n"); - printf(" checksubfile -- check subfile links to parent consistent\n"); + printf(" holdlock -- hold a lock to the logical-file until a key is pressed"); printf(" listexpires -- lists logical files with expiry value\n"); + printf(" listprotect -- list protected files\n"); printf(" listrelationships \n"); - printf(" dfsperm -- returns LDAP permission for file\n"); - printf(" dfscompratio -- returns compression ratio of file\n"); - printf(" dfsscopes -- lists logical scopes (mask = * for all)\n"); - printf(" cleanscopes -- remove empty scopes\n"); printf(" normalizefilenames [] -- normalize existing logical filenames that match, e.g. .::.::scope::.::name -> scope::name\n"); - printf(" dfsreplication [dryrun] -- set redundancy for files matching mask, on specified clusters only\n"); - printf(" holdlock -- hold a lock to the logical-file until a key is pressed"); + printf(" setdfspartattr [] -- set attribute of a file part to value, or delete the attribute if not provided\n"); + printf(" setprotect -- overwrite protects logical file\n"); + printf(" unprotect -- unprotect (if id=* then clear all)\n"); printf("\n"); printf("Workunit commands:\n"); printf(" listworkunits [= [ []]] -- list workunits that match prop=val in workunit name range lower to upper\n"); @@ -90,14 +91,17 @@ void usage(const char *exe) printf(" workunittimings \n"); printf("\n"); printf("Other dali server and misc commands:\n"); - printf(" serverlist -- list server IPs (mask optional)\n"); - printf(" clusterlist -- list clusters (mask optional)\n"); printf(" auditlog \n"); + printf(" cleanglobalwuid [dryrun] [noreconstruct]\n"); + printf(" clusterlist -- list clusters (mask optional)\n"); printf(" coalesce -- force transaction coalesce\n"); - printf(" mpping -- time MP connect\n"); + printf(" dalilocks [ ] [ files ] -- get all locked files/xpaths\n"); printf(" daliping [ ] -- time dali server connect\n"); printf(" getxref -- get all XREF information\n"); - printf(" dalilocks [ ] [ files ] -- get all locked files/xpaths\n"); + printf(" migratefiles [] [dryrun] [createmaps] [listonly] [verbose]\n"); + printf(" mpping -- time MP connect\n"); + printf(" serverlist -- list server IPs (mask optional)\n"); + printf(" translatetoxpath logicalfile [File|SuperFile|Scope]\n"); printf(" unlock <[path|file]> -- unlocks either matching xpath(s) or matching logical file(s), can contain wildcards\n"); printf(" validatestore [fix=]\n" " [verbose=]\n" @@ -106,9 +110,6 @@ void usage(const char *exe) printf(" wuidcompress -- scan workunits that match and compress resources of \n"); printf(" wuiddecompress -- scan workunits that match and decompress resources of \n"); printf(" xmlsize [] -- analyse size usage in xml file, display individual items above 'percentage' \n"); - printf(" migratefiles [] [dryrun] [createmaps] [listonly] [verbose]\n"); - printf(" translatetoxpath logicalfile [File|SuperFile|Scope]\n"); - printf(" cleanglobalwuid [dryrun] [noreconstruct]\n"); printf("\n"); printf("Common options\n"); printf(" server= -- server ip\n"); @@ -148,6 +149,8 @@ int main(int argc, const char* argv[]) StringBuffer tmps; for (int i=1;igetPropBool("fix"); + checkFileSize(userDesc, params.item(1), fix); + } else if (strieq(cmd,"dalilocks")) { CHECKPARAMS(0,2); bool filesonly = false; From feb94f9d9091174724ab510844d05f2040c5252b Mon Sep 17 00:00:00 2001 From: Attila Vamos Date: Fri, 26 Apr 2024 19:19:17 +0100 Subject: [PATCH 43/44] HPCC-31671 Add resolved "CommandMessage" field to GetDFUWorkunits result. Tested locally Signed-off-by: Attila Vamos --- esp/services/ws_fs/ws_fsService.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/esp/services/ws_fs/ws_fsService.cpp b/esp/services/ws_fs/ws_fsService.cpp index 4a83c2cc65c..c493b5cd666 100644 --- a/esp/services/ws_fs/ws_fsService.cpp +++ b/esp/services/ws_fs/ws_fsService.cpp @@ -1115,7 +1115,14 @@ bool CFileSprayEx::onGetDFUWorkunits(IEspContext &context, IEspGetDFUWorkunits & resultWU->setID(wu->queryId()); StringBuffer jobname, user, cluster; resultWU->setJobName(wu->getJobName(jobname).str()); - resultWU->setCommand(wu->getCommand()); + DFUcmd command = wu->getCommand(); + resultWU->setCommand(command); + if (version >= 1.03) + { + StringBuffer cmdStr; + encodeDFUcommand(command, cmdStr); + resultWU->setCommandMessage(cmdStr.str()); + } resultWU->setUser(wu->getUser(user).str()); const char* clusterName = wu->getClusterName(cluster).str(); From 228b603f809a8183211ae71d08b04f688a7419e0 Mon Sep 17 00:00:00 2001 From: Gavin Halliday Date: Wed, 22 Nov 2023 17:10:00 +0000 Subject: [PATCH 44/44] HPCC-29768 Protect updates with a dali lock when fetching a git repo Signed-off-by: Gavin Halliday --- common/fileview2/fvtransform.cpp | 2 +- ecl/eclcc/eclcc.cpp | 94 ++++++++++++++++++++++++---- ecl/eclcc/eclcc.hpp | 1 + ecl/eclccserver/eclccserver.cpp | 51 ++++++++++++++- ecl/hql/hql.hpp | 3 + ecl/hql/hqlplugininfo.cpp | 2 +- ecl/hql/hqlrepository.cpp | 5 ++ ecl/hql/hqlrepository.hpp | 11 +++- ecl/hqlcpp/hqlecl.cpp | 2 + helm/hpcc/templates/eclccserver.yaml | 4 ++ helm/hpcc/values.schema.json | 4 ++ 11 files changed, 162 insertions(+), 17 deletions(-) diff --git a/common/fileview2/fvtransform.cpp b/common/fileview2/fvtransform.cpp index ead6ba5f284..57c0d269bb0 100644 --- a/common/fileview2/fvtransform.cpp +++ b/common/fileview2/fvtransform.cpp @@ -295,7 +295,7 @@ void ViewTransformerRegistry::addPlugins(const char * name) loadedPlugins->loadFromList(name); Owned errorReporter = createThrowingErrorReceiver(); - EclRepositoryManager collection; + EclRepositoryManager collection(nullptr); collection.addSharedSourceFileEclRepository(errorReporter, name, ESFallowplugins|ESFnodependencies, 0, false); dataServer.setown(collection.createPackage(nullptr)); diff --git a/ecl/eclcc/eclcc.cpp b/ecl/eclcc/eclcc.cpp index ece9f7717d7..d4c904c9945 100644 --- a/ecl/eclcc/eclcc.cpp +++ b/ecl/eclcc/eclcc.cpp @@ -207,6 +207,8 @@ struct EclCompileInstance : public CInterfaceOf virtual IHqlExpression *lookupDFSlayout(const char *filename, IErrorReceiver &errs, const ECLlocation &location, bool isOpt) const override; virtual unsigned lookupClusterSize() const override; virtual void getTargetPlatform(StringBuffer & result) override; + virtual IInterface * getGitUpdateLock(const char * key) override; + public: EclCC & eclcc; @@ -239,11 +241,11 @@ struct EclCompileInstance : public CInterfaceOf Linked errorProcessor; }; -class EclCC +class EclCC final : implements CUnsharedInterfaceOf { public: EclCC(int _argc, const char **_argv) - : programName(_argv[0]) + : programName(_argv[0]), repositoryManager(this) { argc = _argc; argv = _argv; @@ -284,12 +286,14 @@ class EclCC // interface ICodegenContextCallback - void pushCluster(const char *clusterName); - void popCluster(); - bool allowAccess(const char * category, bool isSigned); - IHqlExpression *lookupDFSlayout(const char *filename, IErrorReceiver &errs, const ECLlocation &location, bool isOpt) const; - unsigned lookupClusterSize() const; - void getTargetPlatform(StringBuffer & result); + virtual void noteCluster(const char *clusterName) override; + virtual void pushCluster(const char *clusterName) override; + virtual void popCluster() override; + virtual bool allowAccess(const char * category, bool isSigned) override; + virtual IHqlExpression *lookupDFSlayout(const char *filename, IErrorReceiver &errs, const ECLlocation &location, bool isOpt) const override; + virtual unsigned lookupClusterSize() const override; + virtual void getTargetPlatform(StringBuffer & result) override; + virtual IInterface * getGitUpdateLock(const char * key) override; protected: void appendNeverSimplifyList(const char *attribsList); @@ -387,6 +391,7 @@ class EclCC StringAttr optMetaLocation; StringBuffer neverSimplifyRegEx; StringAttr optDefaultGitPrefix; + StringAttr optGitLock; // A key used to lock access to git updates StringAttr optGitUser; StringAttr optGitPasswordPath; @@ -1719,7 +1724,7 @@ void EclCC::processXmlFile(EclCompileInstance & instance, const char *archiveXML if (optCheckEclVersion) instance.checkEclVersionCompatible(); - EclRepositoryManager localRepositoryManager; + EclRepositoryManager localRepositoryManager(&instance); processDefinitions(localRepositoryManager); localRepositoryManager.inherit(repositoryManager); // Definitions, plugins, std library etc. Owned contents; @@ -1839,7 +1844,7 @@ void EclCC::processFile(EclCompileInstance & instance) attributePackage = optDefaultRepo.str(); } - EclRepositoryManager localRepositoryManager; + EclRepositoryManager localRepositoryManager(&instance); processDefinitions(localRepositoryManager); localRepositoryManager.inherit(repositoryManager); // don't include -I if (!optNoBundles) @@ -2066,7 +2071,7 @@ void EclCC::processReference(EclCompileInstance & instance, const char * queryAt if (optArchive || optGenerateDepend || optSaveQueryArchive) instance.archive.setown(createAttributeArchive()); - EclRepositoryManager localRepositoryManager; + EclRepositoryManager localRepositoryManager(&instance); processDefinitions(localRepositoryManager); localRepositoryManager.inherit(repositoryManager); if (!optNoBundles) @@ -2381,6 +2386,7 @@ bool EclCompileInstance::reportErrorSummary() void EclCompileInstance::noteCluster(const char *clusterName) { + eclcc.noteCluster(clusterName); } void EclCompileInstance::pushCluster(const char *clusterName) @@ -2398,6 +2404,12 @@ unsigned EclCompileInstance::lookupClusterSize() const return eclcc.lookupClusterSize(); } +IInterface * EclCompileInstance::getGitUpdateLock(const char * key) +{ + return eclcc.getGitUpdateLock(key); +} + + bool EclCompileInstance::allowAccess(const char * category, bool isSigned) { return eclcc.allowAccess(category, isSigned); @@ -2443,6 +2455,10 @@ void EclCC::appendNeverSimplifyList(const char *attribsList) } } +void EclCC::noteCluster(const char *clusterName) +{ +} + void EclCC::pushCluster(const char *clusterName) { clusters.append(clusterName); @@ -2460,6 +2476,9 @@ bool EclCC::checkDaliConnected() const { if (!daliConnected) { + if (isEmptyString(optDFS) || disconnectReported) + return false; + try { Owned serverGroup = createIGroup(optDFS.str(), DALI_SERVER_PORT); @@ -2489,7 +2508,7 @@ unsigned EclCC::lookupClusterSize() const { CriticalBlock b(dfsCrit); // Overkill at present but maybe one day codegen will start threading? If it does the stack is also iffy! #ifndef _CONTAINERIZED - if (!optDFS || disconnectReported || !checkDaliConnected()) + if (!checkDaliConnected()) return 0; #endif if (prevClusterSize != -1) @@ -2515,10 +2534,56 @@ unsigned EclCC::lookupClusterSize() const return prevClusterSize; } +IInterface * EclCC::getGitUpdateLock(const char * path) +{ + if (optGitLock.isEmpty()) + return nullptr; + + VStringBuffer lockPath("/GitUpdateLocks/%s/hash%llx", optGitLock.str(), rtlHash64VStr(path, HASH64_INIT)); + + CriticalBlock b(dfsCrit); + if (!checkDaliConnected()) + return nullptr; + + DBGLOG("Get git update lock for '%s':'%s'", optGitLock.str(), path); + const unsigned lockTimeout = 30 * 60 * 1000; // 30 minutes - fetches from git can take a long time + const unsigned connectTimeout = 3 * 1000; + unsigned traceTimeout = connectTimeout * 2; + CCycleTimer elapsed; + for (;;) + { + try + { + unsigned remaining = elapsed.remainingMs(lockTimeout); + if (remaining == 0) + break; + + Owned connection = querySDS().connect(lockPath, myProcessSession(), RTM_LOCK_WRITE|RTM_CREATE_QUERY, connectTimeout); + if (connection) + return connection.getClear(); + } + catch (IException * e) + { + unsigned errcode = e->errorCode(); + e->Release(); + if (errcode != SDSExcpt_LockTimeout) + break; + } + if (elapsed.elapsedMs() >= traceTimeout) + { + DBGLOG("Blocked waiting for a git update lock on '%s' for %u seconds", path, elapsed.elapsedMs() / 1000); + traceTimeout *= 2; + } + } + DBGLOG("Failed to get git update lock for '%s'", path); + return nullptr; +} + + IHqlExpression *EclCC::lookupDFSlayout(const char *filename, IErrorReceiver &errs, const ECLlocation &location, bool isOpt) const { CriticalBlock b(dfsCrit); // Overkill at present but maybe one day codegen will start threading? - if (!optDFS || disconnectReported) + if (isEmptyString(optDFS) || disconnectReported) { // Dali lookup disabled, yet translation requested. Should we report if OPT set? if (!(optArchive || optGenerateDepend || optSyntax || optGenerateMeta || optEvaluateResult || disconnectReported)) @@ -2842,6 +2907,9 @@ int EclCC::parseCommandLineOptions(int argc, const char* argv[]) { optScope.set(tempArg); } + else if (iter.matchOption(optGitLock, "--gitlock")) + { + } else if (iter.matchOption(optGitUser, "--gituser")) { } diff --git a/ecl/eclcc/eclcc.hpp b/ecl/eclcc/eclcc.hpp index 8ff08bfaa1b..01f2bcbd59f 100644 --- a/ecl/eclcc/eclcc.hpp +++ b/ecl/eclcc/eclcc.hpp @@ -96,6 +96,7 @@ const char * const helpText[] = { "?! --fastsyntax Delay expanding functions when parsing. May speed up processing for some queries", "? --fetchrepos Automatically download missing repositories associated with dependencies", "! --gituser=x Which user should be used for accessing git repositories (for servers)", + "! --gitlock=key The dali key (e.g. plane name) that should be used to protect updates to git repositories", " -help, --help Display this message", " -help -v Display verbose help message", "! --ignoresimplified Do not use simplified expressions when syntax checking", diff --git a/ecl/eclccserver/eclccserver.cpp b/ecl/eclccserver/eclccserver.cpp index 5758b5eaf9a..18c20951dfa 100644 --- a/ecl/eclccserver/eclccserver.cpp +++ b/ecl/eclccserver/eclccserver.cpp @@ -235,6 +235,45 @@ static bool getHomeFolder(StringBuffer & homepath) return true; } +static bool guardGitUpdates = false; +static StringBuffer gitLockKey; +static void configGitLock() +{ + Owned config = getComponentConfig(); + if (config->getPropBool("@enableEclccDali", true)) + { + if (config->getPropBool("@guardGitUpdates", true)) + { + if (isContainerized()) + { + //Containerized: each git plane needs to be protected independently + gitLockKey.append(config->queryProp("@gitPlane")); + } + else + { + //Bare metal - git repos are fetched locally, so protect per host-ip + const char * hostname = GetCachedHostName(); + if (hostname) + { + gitLockKey.append("host"); + + for (const byte * cur = (const byte *)hostname; *cur; cur++) + { + //remove '.' and other unsupported characters from the key name + if (isalnum(*cur)) + gitLockKey.append(*cur); + else + gitLockKey.append("_"); + } + } + } + + if (!gitLockKey.isEmpty()) + guardGitUpdates = true; + } + } +} + class EclccCompileThread : implements IPooledThread, implements IErrorReporter, public CInterface { StringAttr wuid; @@ -644,6 +683,9 @@ class EclccCompileThread : implements IPooledThread, implements IErrorReporter, if (!repoRootPath.isEmpty()) eclccCmd.appendf(" \"--repocachepath=%s\"", repoRootPath.str()); + if (guardGitUpdates) + eclccCmd.appendf(" \"--gitlock=%s\"", gitLockKey.str()); + if (config->queryProp("@defaultRepo")) eclccCmd.appendf(" --defaultrepo=%s", config->queryProp("@defaultRepo")); if (config->queryProp("@defaultRepoVersion")) @@ -835,7 +877,13 @@ class EclccCompileThread : implements IPooledThread, implements IErrorReporter, if (GetCurrentDirectory(sizeof(dir), dir)) repoRootPath.append(dir); } - if (repoRootPath.length()) + + if (guardGitUpdates) + { + addPathSepChar(repoRootPath).append("repos"); + recursiveCreateDirectory(repoRootPath.str()); + } + else if (repoRootPath.length()) { addPathSepChar(repoRootPath).append("repos_").append(idxStr); recursiveCreateDirectory(repoRootPath.str()); @@ -1421,6 +1469,7 @@ int main(int argc, const char *argv[]) { initClientProcess(serverGroup, DCR_EclCCServer); openLogFile(); + configGitLock(); const char *wuid = globals->queryProp("@workunit"); if (wuid) { diff --git a/ecl/hql/hql.hpp b/ecl/hql/hql.hpp index 1ab43ae1b65..325efbf37a9 100644 --- a/ecl/hql/hql.hpp +++ b/ecl/hql/hql.hpp @@ -226,6 +226,9 @@ interface ICodegenContextCallback : public IInterface * Which platform was this query originally targeted to? */ virtual void getTargetPlatform(StringBuffer & result) = 0; + /* + */ + virtual IInterface * getGitUpdateLock(const char * key) = 0; }; diff --git a/ecl/hql/hqlplugininfo.cpp b/ecl/hql/hqlplugininfo.cpp index e0d1cd409c7..c48ab0fd236 100644 --- a/ecl/hql/hqlplugininfo.cpp +++ b/ecl/hql/hqlplugininfo.cpp @@ -29,7 +29,7 @@ namespace repositoryCommon { IEclPackage * loadPlugins(const char * pluginPath) { MultiErrorReceiver errs; - EclRepositoryManager collection; + EclRepositoryManager collection(nullptr); collection.addQuerySourceFileEclRepository(&errs, pluginPath, ESFallowplugins|ESFnodependencies, (unsigned) -1);//Preload implicits/dlls if (errs.errCount()) { diff --git a/ecl/hql/hqlrepository.cpp b/ecl/hql/hqlrepository.cpp index 8b7c5a47649..78b0edc575f 100644 --- a/ecl/hql/hqlrepository.cpp +++ b/ecl/hql/hqlrepository.cpp @@ -793,6 +793,7 @@ IEclSourceCollection * EclRepositoryManager::resolveGitCollection(const char * r throw makeStringExceptionV(99, "Unsupported repository link format '%s'", defaultUrl); bool alreadyExists = false; + Owned gitUpdateLock(getGitUpdateLock(repoPath)); if (checkDirExists(repoPath)) { if (options.cleanRepos) @@ -855,6 +856,10 @@ IEclSourceCollection * EclRepositoryManager::resolveGitCollection(const char * r ok = true; } } + //All following operations are read-only and should not be affected if the git repo is updated behind the scenes + //this could become a read/write lock if that proved to be an issue. + gitUpdateLock.clear(); + gitDownloadCycles += gitDownloadTimer.elapsedCycles(); if (error) { diff --git a/ecl/hql/hqlrepository.hpp b/ecl/hql/hqlrepository.hpp index a69febb6159..9bac5fd7626 100644 --- a/ecl/hql/hqlrepository.hpp +++ b/ecl/hql/hqlrepository.hpp @@ -38,7 +38,9 @@ class EclRepositoryMapping : public CInterface class HQL_API EclRepositoryManager { public: - EclRepositoryManager() = default; + EclRepositoryManager(ICodegenContextCallback * _callback) : callback(_callback) + { + } EclRepositoryManager(const EclRepositoryManager & other) = delete; void addNestedRepository(IIdAtom * scopeId, IEclSourceCollection * source, bool includeInArchive); @@ -86,10 +88,17 @@ class HQL_API EclRepositoryManager unsigned runGitCommand(StringBuffer * output, const char *args, const char * cwd, bool needCredentials); IEclPackage * queryRepository(IIdAtom * name, const char * defaultUrl, IEclSourceCollection * overrideSource, bool includeDefinitions); + IInterface * getGitUpdateLock(const char * path) + { + if (!callback) + return nullptr; + return callback->getGitUpdateLock(path); + } private: mutable IErrorReceiver * errorReceiver = nullptr; // mutable to allow const methods to set it, it logically doesn't change the object using DependencyInfo = std::pair>; + ICodegenContextCallback * callback; CIArrayOf repos; std::vector dependencies; IArrayOf sharedSources; // plugins, std library, bundles diff --git a/ecl/hqlcpp/hqlecl.cpp b/ecl/hqlcpp/hqlecl.cpp index 673ad1ecbf9..fd0e554b2d9 100644 --- a/ecl/hqlcpp/hqlecl.cpp +++ b/ecl/hqlcpp/hqlecl.cpp @@ -150,6 +150,8 @@ class NullContextCallback : implements ICodegenContextCallback, public CInterfac virtual bool allowAccess(const char * category, bool isSigned) override { return true; } virtual IHqlExpression *lookupDFSlayout(const char *filename, IErrorReceiver &errs, const ECLlocation &location, bool isOpt) const override { return nullptr; } virtual unsigned lookupClusterSize() const override { return 0; } + virtual IInterface * getGitUpdateLock(const char * key) override { return nullptr; } + virtual void getTargetPlatform(StringBuffer & result) override { workunit->getDebugValue("targetClusterType", StringBufferAdaptor(result)); diff --git a/helm/hpcc/templates/eclccserver.yaml b/helm/hpcc/templates/eclccserver.yaml index 9fae0b41e17..171885bde33 100644 --- a/helm/hpcc/templates/eclccserver.yaml +++ b/helm/hpcc/templates/eclccserver.yaml @@ -27,6 +27,7 @@ Pass in dict with root and me */}} {{- define "hpcc.eclccServerConfigMap" -}} {{- $compileJobName := printf "compile-job-_HPCC_JOBNAME_" }} +{{- $gitPlane := .me.gitPlane | default (include "hpcc.getDefaultGitPlane" .root) }} apiVersion: v1 metadata: name: {{ .me.name }}-configmap @@ -37,6 +38,9 @@ data: {{ toYaml (omit .me "logging" "tracing") | indent 6 }} {{- include "hpcc.generateLoggingConfig" . | indent 6 }} {{- include "hpcc.generateTracingConfig" . | indent 6 }} +{{- if $gitPlane }} + gitPlane: {{ $gitPlane }} +{{- end }} queues: {{ include "hpcc.generateConfigMapQueues" .root | indent 6 }} {{ include "hpcc.generateVaultConfig" . | indent 6 }} diff --git a/helm/hpcc/values.schema.json b/helm/hpcc/values.schema.json index 22cdcf51205..c4cc710b8c9 100644 --- a/helm/hpcc/values.schema.json +++ b/helm/hpcc/values.schema.json @@ -1421,6 +1421,10 @@ "type": "string", "description": "The default repo version used if not supplied for the defaultRepo" }, + "guardGitUpdates": { + "type": "boolean", + "description": "If enabled all updates of the git repositories are protected by holding a lock in dali" + }, "terminationGracePeriodSeconds": { "$ref": "#/definitions/terminationGracePeriodSeconds" },