From d0135d1865a2a64262369e242422f9ac5b6816cf Mon Sep 17 00:00:00 2001 From: "ivan.ruzavin" Date: Thu, 7 Nov 2024 09:58:00 +0100 Subject: [PATCH 1/5] Added release hw to new-feature/boards_cards/10 --- .../board.cmake | 5 + .../board_audio_development_for_pic32/board.h | 120 +++++++++++++ .../boards/board_chipkit_max32/board.cmake | 5 + .../boards/board_chipkit_max32/board.h | 157 ++++++++++++++++++ changelog/new_hw.md | 31 ++++ .../board-audio-development-for-pic32.png | Bin 0 -> 18164 bytes .../images/boards/board-chipkit-max32.png | Bin 0 -> 22850 bytes .../Boards.json | 16 ++ .../LinkerTables.json | 20 +++ .../boards/board_chipkit_max32/Boards.json | 16 ++ .../board_chipkit_max32/LinkerTables.json | 20 +++ .../Devices.json | 18 ++ .../LinkerTables.json | 38 +++++ 13 files changed, 446 insertions(+) create mode 100644 bsp/board/include/boards/board_audio_development_for_pic32/board.cmake create mode 100644 bsp/board/include/boards/board_audio_development_for_pic32/board.h create mode 100644 bsp/board/include/boards/board_chipkit_max32/board.cmake create mode 100644 bsp/board/include/boards/board_chipkit_max32/board.h create mode 100644 changelog/new_hw.md create mode 100644 resources/images/boards/board-audio-development-for-pic32.png create mode 100644 resources/images/boards/board-chipkit-max32.png create mode 100644 resources/queries/boards/board_audio_development_for_pic32/Boards.json create mode 100644 resources/queries/boards/board_audio_development_for_pic32/LinkerTables.json create mode 100644 resources/queries/boards/board_chipkit_max32/Boards.json create mode 100644 resources/queries/boards/board_chipkit_max32/LinkerTables.json create mode 100644 resources/queries/cards/mcu_card_11_for_pic_pic18f56k42/Devices.json create mode 100644 resources/queries/cards/mcu_card_11_for_pic_pic18f56k42/LinkerTables.json diff --git a/bsp/board/include/boards/board_audio_development_for_pic32/board.cmake b/bsp/board/include/boards/board_audio_development_for_pic32/board.cmake new file mode 100644 index 000000000..35d5a28cc --- /dev/null +++ b/bsp/board/include/boards/board_audio_development_for_pic32/board.cmake @@ -0,0 +1,5 @@ +if(${_MSDK_BOARD_NAME_} STREQUAL "AUDIO_FOR_PIC32_MCUS_DEVELOPMENT_BOARD") + set(BOARD_PATH "include/boards/board_audio_development_for_pic32") + set(MCU_CARD FALSE) + set(SHIELD FALSE) +endif() diff --git a/bsp/board/include/boards/board_audio_development_for_pic32/board.h b/bsp/board/include/boards/board_audio_development_for_pic32/board.h new file mode 100644 index 000000000..5b004252c --- /dev/null +++ b/bsp/board/include/boards/board_audio_development_for_pic32/board.h @@ -0,0 +1,120 @@ +/**************************************************************************** +** +** Copyright (C) ${COPYRIGHT_YEAR} MikroElektronika d.o.o. +** Contact: https://www.mikroe.com/contact +** +** This file is part of the mikroSDK package +** +** Commercial License Usage +** +** Licensees holding valid commercial NECTO compilers AI licenses may use this +** file in accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The MikroElektronika Company. +** For licensing terms and conditions see +** https://www.mikroe.com/legal/software-license-agreement. +** For further information use the contact form at +** https://www.mikroe.com/contact. +** +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used for +** non-commercial projects under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** The above copyright notice and this permission notice shall be +** included in all copies or substantial portions of the Software. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +** OF MERCHANTABILITY, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +** TO THE WARRANTIES FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +** DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT +** OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE +** OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +** +****************************************************************************/ +/*! + * @file board.h + * @brief Main board pin mapping. + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#define BOARD_NAME "PIC32 Audio Development Board" + +#include "hal_target.h" + +// Mapping +#define HEADER_CONNECTOR_CN1_D1 PD0 +#define HEADER_CONNECTOR_CN1_D2 PC13 +#define HEADER_CONNECTOR_CN1_D3 PC14 +#define HEADER_CONNECTOR_CN1_S1 PD3 +#define HEADER_CONNECTOR_CN1_S2 PD2 +#define HEADER_CONNECTOR_CN1_S3 PD1 +#define HEADER_CONNECTOR_CN1_S4 PD12 +#define HEADER_CONNECTOR_CN1_MCLR // Pin not routed +#define HEADER_CONNECTOR_CN1_SELECT PE9 +#define HEADER_CONNECTOR_CN1_ACC PB4 +#define HEADER_CONNECTOR_CN1_OVERCURRENT PB0 +#define HEADER_CONNECTOR_CN1_PGC PB6 +#define HEADER_CONNECTOR_CN1_PGD PB7 +#define HEADER_CONNECTOR_CN1_RXD PF13 +#define HEADER_CONNECTOR_CN1_TXD PF12 +#define HEADER_CONNECTOR_CN1_VBUS // Pin not routed +#define HEADER_CONNECTOR_CN1_D_NEG PG3 +#define HEADER_CONNECTOR_CN1_D_POS PG2 +#define HEADER_CONNECTOR_CN1_VCAP // Pin not routed +#define HEADER_CONNECTOR_CN1_ACC_PWR PE8 +#define HEADER_CONNECTOR_CN1_ACC_ID_SEL0 PB3 +#define HEADER_CONNECTOR_CN1_ACC_ID_SEL1 PB2 +#define HEADER_CONNECTOR_CN1_SDA PF2 +#define HEADER_CONNECTOR_CN1_SCL PF8 +#define HEADER_CONNECTOR_CN1_SCL2 PA2 +#define HEADER_CONNECTOR_CN1_SDA2 PA3 +#define HEADER_CONNECTOR_CN1_C_RESET PD14 +#define HEADER_CONNECTOR_CN1_IPOD_DETECT PD15 + +// LCD +#define LCD_DB5 PE5 +#define LCD_DB6 PE6 +#define LCD_DB7 PE7 +#define LCD_RESET PC1 +#define LCD_D_C PB15 +#define LCD_CS PD11 +#define LCD_WR PD4 +#define LCD_RD PD5 +#define LCD_DB0 PE0 +#define LCD_DB1 PE1 +#define LCD_DB2 PE2 +#define LCD_DB3 PE3 +#define LCD_DB4 PE4 + +// CODEC +#define CODEC_BCLK PG6 +#define CODEC_ADCDAT PG7 +#define CODEC_DACDAT PG8 +#define CODEC_DACLRC PG9 + +// USB +#define USB_OVERCURRENT PB1 +#define USB_VBUSON PB5 + +// COMM +#define USB_UART_RX PF4 +#define USB_UART_TX PF5 + +#ifdef __cplusplus +} +#endif + +#endif // _BOARD_H_ +// ------------------------------------------------------------------------- END diff --git a/bsp/board/include/boards/board_chipkit_max32/board.cmake b/bsp/board/include/boards/board_chipkit_max32/board.cmake new file mode 100644 index 000000000..3d50671f1 --- /dev/null +++ b/bsp/board/include/boards/board_chipkit_max32/board.cmake @@ -0,0 +1,5 @@ +if(${_MSDK_BOARD_NAME_} STREQUAL "CHIPKIT_MAX32_DEVELOPMENT_BOARD") + set(BOARD_PATH "include/boards/board_chipkit_max32") + set(MCU_CARD FALSE) + set(SHIELD FALSE) +endif() diff --git a/bsp/board/include/boards/board_chipkit_max32/board.h b/bsp/board/include/boards/board_chipkit_max32/board.h new file mode 100644 index 000000000..a11de55a5 --- /dev/null +++ b/bsp/board/include/boards/board_chipkit_max32/board.h @@ -0,0 +1,157 @@ +/**************************************************************************** +** +** Copyright (C) ${COPYRIGHT_YEAR} MikroElektronika d.o.o. +** Contact: https://www.mikroe.com/contact +** +** This file is part of the mikroSDK package +** +** Commercial License Usage +** +** Licensees holding valid commercial NECTO compilers AI licenses may use this +** file in accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The MikroElektronika Company. +** For licensing terms and conditions see +** https://www.mikroe.com/legal/software-license-agreement. +** For further information use the contact form at +** https://www.mikroe.com/contact. +** +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used for +** non-commercial projects under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** The above copyright notice and this permission notice shall be +** included in all copies or substantial portions of the Software. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +** OF MERCHANTABILITY, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +** TO THE WARRANTIES FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +** DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT +** OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE +** OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +** +****************************************************************************/ +/*! + * @file board.h + * @brief Main board pin mapping. + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#define BOARD_NAME "chipKIT Max32 Development Board" + +#include "hal_target.h" + +// Mapping +#define HEADER_CONNECTOR_CN3_D1 PD12 +#define HEADER_CONNECTOR_CN3_D2 PG1 +#define HEADER_CONNECTOR_CN3_D3 PD3 +#define HEADER_CONNECTOR_CN3_D4 PG0 +#define HEADER_CONNECTOR_CN3_D5 PD4 +#define HEADER_CONNECTOR_CN3_D6 PA6 +#define HEADER_CONNECTOR_CN3_D7 PC4 +#define HEADER_CONNECTOR_CN3_D8 PA7 +#define HEADER_CONNECTOR_CN3_D9 PA2 +#define HEADER_CONNECTOR_CN3_D10 PG14 +#define HEADER_CONNECTOR_CN3_D11 PA3 +#define HEADER_CONNECTOR_CN3_D12 PG12 +#define HEADER_CONNECTOR_CN3_D13 // Pin not routed +#define HEADER_CONNECTOR_CN3_D14 PG13 +#define HEADER_CONNECTOR_CN3_D15 // Pin not routed +#define HEADER_CONNECTOR_CN3_D16 PA9 + +#define HEADER_CONNECTOR_CN4_D1 PA14 +#define HEADER_CONNECTOR_CN4_D2 PA15 +#define HEADER_CONNECTOR_CN4_D3 PD14 +#define HEADER_CONNECTOR_CN4_D4 PD15 +#define HEADER_CONNECTOR_CN4_D5 PF4 +#define HEADER_CONNECTOR_CN4_D6 PF5 +#define HEADER_CONNECTOR_CN4_D7 PF12 +#define HEADER_CONNECTOR_CN4_D8 PF13 + +#define HEADER_CONNECTOR_CN5_D1 PB0 +#define HEADER_CONNECTOR_CN5_D2 PB1 +#define HEADER_CONNECTOR_CN5_D3 PB2 +#define HEADER_CONNECTOR_CN5_D4 PB3 +#define HEADER_CONNECTOR_CN5_D5 PB4 +#define HEADER_CONNECTOR_CN5_D6 PB5 +#define HEADER_CONNECTOR_CN5_D7 PB6 +#define HEADER_CONNECTOR_CN5_D8 PB7 + +#define HEADER_CONNECTOR_CN7_D1 PB8 +#define HEADER_CONNECTOR_CN7_D2 PB9 +#define HEADER_CONNECTOR_CN7_D3 PB10 +#define HEADER_CONNECTOR_CN7_D4 PB11 +#define HEADER_CONNECTOR_CN7_D6 PB13 +#define HEADER_CONNECTOR_CN7_D5 PB12 +#define HEADER_CONNECTOR_CN7_D7 PB14 +#define HEADER_CONNECTOR_CN7_D8 PB15 + +#define HEADER_CONNECTOR_CN8_D1 PG9 +#define HEADER_CONNECTOR_CN8_D2 PG6 +#define HEADER_CONNECTOR_CN8_D3 PG8 +#define HEADER_CONNECTOR_CN8_D4 PG7 +#define HEADER_CONNECTOR_CN8_D5 PD11 +#define HEADER_CONNECTOR_CN8_D6 PD8 +#define HEADER_CONNECTOR_CN8_D7 PD6 +#define HEADER_CONNECTOR_CN8_D8 PF1 +#define HEADER_CONNECTOR_CN8_D9 PF0 +#define HEADER_CONNECTOR_CN8_D10 PA10 +#define HEADER_CONNECTOR_CN8_D11 PG8 +#define HEADER_CONNECTOR_CN8_D12 PB12 +#define HEADER_CONNECTOR_CN8_D13 PB13 +#define HEADER_CONNECTOR_CN8_D14 PB11 +#define HEADER_CONNECTOR_CN8_D15 PD5 +#define HEADER_CONNECTOR_CN8_D16 PD10 + +#define HEADER_CONNECTOR_CN9_D1 PE0 +#define HEADER_CONNECTOR_CN9_D2 PE1 +#define HEADER_CONNECTOR_CN9_D3 PE2 +#define HEADER_CONNECTOR_CN9_D4 PE3 +#define HEADER_CONNECTOR_CN9_D5 PE4 +#define HEADER_CONNECTOR_CN9_D6 PE5 +#define HEADER_CONNECTOR_CN9_D7 PE6 +#define HEADER_CONNECTOR_CN9_D8 PE7 +#define HEADER_CONNECTOR_CN9_D9 PG7 +#define HEADER_CONNECTOR_CN9_D10 PG15 +#define HEADER_CONNECTOR_CN9_D11 PG2 +#define HEADER_CONNECTOR_CN9_D12 PG3 +#define HEADER_CONNECTOR_CN9_D13 PF3 +#define HEADER_CONNECTOR_CN9_D14 // Pin not routed +#define HEADER_CONNECTOR_CN9_D15 PC3 +#define HEADER_CONNECTOR_CN9_D16 PC2 + +#define HEADER_CONNECTOR_CN14_D1 PF2 +#define HEADER_CONNECTOR_CN14_D2 PA0 +#define HEADER_CONNECTOR_CN14_D3 PF8 +#define HEADER_CONNECTOR_CN14_D4 PA1 +#define HEADER_CONNECTOR_CN14_D5 PE8 +#define HEADER_CONNECTOR_CN14_D6 PA4 +#define HEADER_CONNECTOR_CN14_D7 PD0 +#define HEADER_CONNECTOR_CN14_D8 PA5 +#define HEADER_CONNECTOR_CN14_D9 PC14 +#define HEADER_CONNECTOR_CN14_D10 PD9 +#define HEADER_CONNECTOR_CN14_D11 PD1 +#define HEADER_CONNECTOR_CN14_D12 PC13 +#define HEADER_CONNECTOR_CN14_D13 PD2 +#define HEADER_CONNECTOR_CN14_D14 PD13 +#define HEADER_CONNECTOR_CN14_D15 PE9 +#define HEADER_CONNECTOR_CN14_D16 PD7 + +#ifdef __cplusplus +} +#endif + +#endif // _BOARD_H_ +// ------------------------------------------------------------------------- END diff --git a/changelog/new_hw.md b/changelog/new_hw.md new file mode 100644 index 000000000..acb2c7226 --- /dev/null +++ b/changelog/new_hw.md @@ -0,0 +1,31 @@ +

+ MikroElektronika +

+ +--- + +**[BACK TO PREVIOUS FILE](../changelog.md)** + +--- + +# `DATE` + +## Changes + +- [`DATE`](#date) + - [Changes](#changes) + - [NEW HARDWARE](#new-hardware) + +### NEW HARDWARE + +Support added for following hardware: + ++ [Audio Development Board For PIC32 MCUs](https://mplab-discover.microchip.com/v2/item/com.microchip.portal.evalboard/com.microchip.subcategories.modules-and-peripherals.communication.can.Others/mcu08.dm320011/1.0.0?view=about) ++ [ChipKit MAX32 Development Board](https://mplab-discover.microchip.com/v2/item/com.microchip.portal.evalboard/com.microchip.subcategories.modules-and-peripherals.communication.can.Others/mcu08.tdgl003/1.0.0?view=about) ++ [MCU CARD 11 for PIC PIC18F56K42](https://www.mikroe.com/mcu-card-11-for-pic-pic18f56k42) + +--- + +**[BACK TO PREVIOUS FILE](../changelog.md)** + +--- diff --git a/resources/images/boards/board-audio-development-for-pic32.png b/resources/images/boards/board-audio-development-for-pic32.png new file mode 100644 index 0000000000000000000000000000000000000000..f92ce3022bf1b27ac5ed254a07aacb73e5b0b850 GIT binary patch literal 18164 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 literal 0 HcmV?d00001 diff --git a/resources/images/boards/board-chipkit-max32.png b/resources/images/boards/board-chipkit-max32.png new file mode 100644 index 0000000000000000000000000000000000000000..2509f85487f533400f0093ab31058a975beb5905 GIT binary patch literal 22850 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 Date: Thu, 14 Nov 2024 13:02:53 +0100 Subject: [PATCH 2/5] Added workflow for copying indexes to DBP --- .github/workflows/copyIndexesToDBP.yaml | 94 +++++++++++++++++++++++++ scripts/classes/class_es.py | 19 +++-- scripts/index_to_me.py | 63 +++++++++++++++++ 3 files changed, 171 insertions(+), 5 deletions(-) create mode 100644 .github/workflows/copyIndexesToDBP.yaml create mode 100644 scripts/index_to_me.py diff --git a/.github/workflows/copyIndexesToDBP.yaml b/.github/workflows/copyIndexesToDBP.yaml new file mode 100644 index 000000000..b0d3ff7b7 --- /dev/null +++ b/.github/workflows/copyIndexesToDBP.yaml @@ -0,0 +1,94 @@ +name: Copy Indexes from AWS to DBP + +on: + workflow_dispatch: + inputs: + select_index: + type: choice + description: Copy Test and/or Live ES indexed items + options: + - Test + - Live + - Both + regex: + type: string + description: Regex to use when searching for indexed items + default: "images_sdk|templates|mikrosdk|mcucard|mcu_card|click|mikromedia|pim|queries|sibrain|kit|board" + +jobs: + manual_run: + if: ${{ github.event_name == 'workflow_dispatch' }} + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.x' + + - name: Install Dependencies + run: | + python -m pip install --upgrade pip + pip install -r scripts/requirements/check_index.txt + + - name: Copy Indexed Links - Live + if: ${{ github.event.inputs.select_index == 'Live' || github.event.inputs.select_index == 'Both' }} + run: | + python -u scripts/index_to_me.py ${{ github.repository }} ${{ secrets.GITHUB_TOKEN }} ${{ secrets.ES_HOST }} ${{ secrets.ES_USER }} ${{ secrets.ES_PASSWORD }} ${{ secrets.ME_ES_HOST }} ${{ secrets.ME_ES_USER }} ${{ secrets.ME_ES_PASSWORD }} ${{ secrets.ES_INDEX_LIVE }} "--es_regex" "${{ github.event.inputs.regex }}" + + - name: Copy Indexed Links - Test + if: ${{ github.event.inputs.select_index == 'Test' || github.event.inputs.select_index == 'Both' }} + run: | + python -u scripts/index_to_me.py ${{ github.repository }} ${{ secrets.GITHUB_TOKEN }} ${{ secrets.ES_HOST }} ${{ secrets.ES_USER }} ${{ secrets.ES_PASSWORD }} ${{ secrets.ME_ES_HOST }} ${{ secrets.ME_ES_USER }} ${{ secrets.ME_ES_PASSWORD }} ${{ secrets.ES_INDEX_TEST }} "--es_regex" "${{ github.event.inputs.regex }}" + + push_to_main_run: + if: ${{ github.event_name == 'push' }} + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.x' + + - name: Install Dependencies + run: | + python -m pip install --upgrade pip + pip install -r scripts/requirements/check_index.txt + + - name: Check Indexed Links - Live + run: | + python -u scripts/index_to_me.py ${{ github.repository }} ${{ secrets.GITHUB_TOKEN }} ${{ secrets.ES_HOST }} ${{ secrets.ES_USER }} ${{ secrets.ES_PASSWORD }} ${{ secrets.ME_ES_HOST }} ${{ secrets.ME_ES_USER }} ${{ secrets.ME_ES_PASSWORD }} ${{ secrets.ES_INDEX_LIVE }} "--es_regex" "images_sdk|templates|mikrosdk|mcucard|mcu_card|click|mikromedia|pim|queries|sibrain|kit|board" + + - name: Check Indexed Links - Test + run: | + python -u scripts/index_to_me.py ${{ github.repository }} ${{ secrets.GITHUB_TOKEN }} ${{ secrets.ES_HOST }} ${{ secrets.ES_USER }} ${{ secrets.ES_PASSWORD }} ${{ secrets.ME_ES_HOST }} ${{ secrets.ME_ES_USER }} ${{ secrets.ME_ES_PASSWORD }} ${{ secrets.ES_INDEX_TEST }} "--es_regex" "images_sdk|templates|mikrosdk|mcucard|mcu_card|click|mikromedia|pim|queries|sibrain|kit|board" + + scheduled_run: + if: ${{ github.event_name == 'schedule' }} + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.x' + + - name: Install Dependencies + run: | + python -m pip install --upgrade pip + pip install -r scripts/requirements/check_index.txt + + - name: Check Indexed Links - Live + run: | + python -u scripts/index_to_me.py ${{ github.repository }} ${{ secrets.GITHUB_TOKEN }} ${{ secrets.ES_HOST }} ${{ secrets.ES_USER }} ${{ secrets.ES_PASSWORD }} ${{ secrets.ME_ES_HOST }} ${{ secrets.ME_ES_USER }} ${{ secrets.ME_ES_PASSWORD }} ${{ secrets.ES_INDEX_LIVE }} "--es_regex" "images_sdk|templates|mikrosdk|mcucard|mcu_card|click|mikromedia|pim|queries|sibrain|kit|board" + + - name: Check Indexed Links - Test + run: | + python -u scripts/index_to_me.py ${{ github.repository }} ${{ secrets.GITHUB_TOKEN }} ${{ secrets.ES_HOST }} ${{ secrets.ES_USER }} ${{ secrets.ES_PASSWORD }} ${{ secrets.ME_ES_HOST }} ${{ secrets.ME_ES_USER }} ${{ secrets.ME_ES_PASSWORD }} ${{ secrets.ES_INDEX_TEST }} "--es_regex" "images_sdk|templates|mikrosdk|mcucard|mcu_card|click|mikromedia|pim|queries|sibrain|kit|board" diff --git a/scripts/classes/class_es.py b/scripts/classes/class_es.py index 149e4a1d6..731edae10 100644 --- a/scripts/classes/class_es.py +++ b/scripts/classes/class_es.py @@ -119,12 +119,21 @@ def create(self, doc_type, doc_id, doc_body): def update(self, doc_type, doc_id, doc_body): response = self.api_index(self.es_instance, self.index, doc_type, doc_id, doc_body) - if response['created'] and 'created' == response['result']: - print("%sWARNING: Asset \"%s\" created instead of updating. - %s" % (self.Colors.WARNING, doc_body['name'], doc_body['download_link'])) - elif not 'updated' == response['result']: - raise ValueError("%s%s failed to update on %s!" % (self.Colors.FAIL, doc_id, self.index)) + if doc_type: + if response['created'] and 'created' == response['result']: + print("%sWARNING: Asset \"%s\" created instead of updating. - %s" % (self.Colors.WARNING, doc_body['name'], doc_body['download_link'])) + elif not 'updated' == response['result']: + raise ValueError("%s%s failed to update on %s!" % (self.Colors.FAIL, doc_id, self.index)) + else: + print("%sINFO: Asset \"%s\" updated. - %s" % (self.Colors.OKGREEN, doc_body['name'], doc_body['download_link'])) + # For new DBP elasticsearch there is no 'created' field in response, so we just check 'result' else: - print("%sINFO: Asset \"%s\" updated. - %s" % (self.Colors.OKGREEN, doc_body['name'], doc_body['download_link'])) + if 'created' == response['result']: + print("%sWARNING: Asset \"%s\" created instead of updating. - %s" % (self.Colors.WARNING, doc_body['name'], doc_body['download_link'])) + elif not 'updated' == response['result']: + raise ValueError("%s%s failed to update on %s!" % (self.Colors.FAIL, doc_id, self.index)) + else: + print("%sINFO: Asset \"%s\" updated. - %s" % (self.Colors.OKGREEN, doc_body['name'], doc_body['download_link'])) def delete(self, doc_type, doc_id): response = self.es_instance.delete( diff --git a/scripts/index_to_me.py b/scripts/index_to_me.py new file mode 100644 index 000000000..06cd3625f --- /dev/null +++ b/scripts/index_to_me.py @@ -0,0 +1,63 @@ +import sys, json, argparse, requests + +import classes.class_gh as gh +import classes.class_es as es + +if __name__ == "__main__": + # Get arguments + parser = argparse.ArgumentParser(description="Upload directories as release assets.") + parser.add_argument("gh_repo", help="Github repository name, e.g., 'username/repo'", type=str) + parser.add_argument("gh_token", help="GitHub Token", type=str) + parser.add_argument("es_host", help="ES instance host value", type=str) + parser.add_argument("es_user", help="ES instance user value", type=str) + parser.add_argument("es_password", help="ES instance password value", type=str) + parser.add_argument("me_es_host", help="MikroE ES instance host value", type=str) + parser.add_argument("me_es_user", help="MikroE ES instance user value", type=str) + parser.add_argument("me_es_password", help="MikroE ES instance password value", type=str) + parser.add_argument("--es_regex", help="Regex to use to fetch indexed items", type=str, default=".+") + args = parser.parse_args() + + es_instance = es.index( + es_host=args.es_host, es_user=args.es_user, es_password=args.es_password, + index=args.es_index, token=args.gh_token + ) + + me_es_instance = es.index( + es_host=args.me_es_host, es_user=args.me_es_user, es_password=args.me_es_password, + index=args.es_index, token=args.gh_token + ) + + gh_instance = gh.repo(args.gh_repo, args.gh_token) + + es_instance.fetch(regex=args.es_regex) + + headers = { + 'Authorization': f'token {args.gh_token}' + } + + for indexed_item in es_instance.indexed_items: + asset_status = requests.get(indexed_item['source']['download_link'], headers=headers) + if es_instance.Status.ERROR.value == asset_status.status_code: ## code 404 - error, reindex with correct download link + print("%sERROR: Asset \"%s\" download link is incorrect. - %s" % (es_instance.Colors.FAIL, indexed_item['source']['name'], indexed_item['source']['download_link'])) + if 'gh_package_name' in indexed_item['source']: + url = gh_instance.asset_fetch_url_api(indexed_item['source']['gh_package_name'], loose=False) + indexed_item['source']['download_link'] = url + es_instance.update(indexed_item['doc']['type'], indexed_item['doc']['id'], indexed_item['source']) + else: + print("%sWARNING: Asset \"%s\" has no \"gh_package_name\" in the index." % (es_instance.Colors.WARNING, indexed_item['source']['name'])) + else: ## code 200 - success, no need to reindex + package_name = (json.loads(asset_status.text))['name'] + if 'gh_package_name' not in indexed_item['source']: + indexed_item['source'].update({"gh_package_name": package_name}) + es_instance.update(indexed_item['doc']['type'], indexed_item['doc']['id'], indexed_item['source']) + print("%sINFO: Added \"gh_package_name\" to %s" % (es_instance.Colors.UNDERLINE, indexed_item['source']['name'])) + else: + if package_name != indexed_item['source']['gh_package_name']: + indexed_item['source']['gh_package_name'] = package_name + es_instance.update(indexed_item['doc']['type'], indexed_item['doc']['id'], indexed_item['source']) + print("%sINFO: Updated \"gh_package_name\" for %s" % (es_instance.Colors.UNDERLINE, indexed_item['source']['name'])) + print("%sOK: Asset \"%s\" download link is correct. - %s" % (es_instance.Colors.OKBLUE, indexed_item['source']['name'], indexed_item['source']['download_link'])) + + # For new elasticsearch DBP it is crucial not to use doc_type for indexing + me_es_instance.update(None, indexed_item['doc']['id'], indexed_item['source']) + print("%sINFO: Copied \"%s\" index from AWS to DBS" % (me_es_instance.Colors.UNDERLINE, indexed_item['source']['name'], )) From 8a3a289ffb63546f7e64bc5168957ba7518514e5 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 15 Nov 2024 07:12:40 +0000 Subject: [PATCH 3/5] Remove old changelog file after moving it --- changelog/new_hw.md | 31 ------------------------------- 1 file changed, 31 deletions(-) delete mode 100644 changelog/new_hw.md diff --git a/changelog/new_hw.md b/changelog/new_hw.md deleted file mode 100644 index acb2c7226..000000000 --- a/changelog/new_hw.md +++ /dev/null @@ -1,31 +0,0 @@ -

- MikroElektronika -

- ---- - -**[BACK TO PREVIOUS FILE](../changelog.md)** - ---- - -# `DATE` - -## Changes - -- [`DATE`](#date) - - [Changes](#changes) - - [NEW HARDWARE](#new-hardware) - -### NEW HARDWARE - -Support added for following hardware: - -+ [Audio Development Board For PIC32 MCUs](https://mplab-discover.microchip.com/v2/item/com.microchip.portal.evalboard/com.microchip.subcategories.modules-and-peripherals.communication.can.Others/mcu08.dm320011/1.0.0?view=about) -+ [ChipKit MAX32 Development Board](https://mplab-discover.microchip.com/v2/item/com.microchip.portal.evalboard/com.microchip.subcategories.modules-and-peripherals.communication.can.Others/mcu08.tdgl003/1.0.0?view=about) -+ [MCU CARD 11 for PIC PIC18F56K42](https://www.mikroe.com/mcu-card-11-for-pic-pic18f56k42) - ---- - -**[BACK TO PREVIOUS FILE](../changelog.md)** - ---- From 039ab6a137a1aff291fdf28e189d7f7f50f182e9 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 15 Nov 2024 07:12:41 +0000 Subject: [PATCH 4/5] Updated changelog files with latest release info. --- changelog/v2.12.0/changelog.md | 1 + changelog/v2.12.0/new_hw/2024-11-15.md | 31 ++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 changelog/v2.12.0/new_hw/2024-11-15.md diff --git a/changelog/v2.12.0/changelog.md b/changelog/v2.12.0/changelog.md index 148eb2cc9..ceb0a3897 100644 --- a/changelog/v2.12.0/changelog.md +++ b/changelog/v2.12.0/changelog.md @@ -47,6 +47,7 @@ Support added for following hardware: + **[2024-11-12](./new_hw/2024-11-12.md)** + **[2024-11-13](./new_hw/2024-11-13.md)** + **[2024-11-14](./new_hw/2024-11-14.md)** ++ **[2024-11-15](./new_hw/2024-11-15.md)** --- diff --git a/changelog/v2.12.0/new_hw/2024-11-15.md b/changelog/v2.12.0/new_hw/2024-11-15.md new file mode 100644 index 000000000..1bf5e2727 --- /dev/null +++ b/changelog/v2.12.0/new_hw/2024-11-15.md @@ -0,0 +1,31 @@ +

+ MikroElektronika +

+ +--- + +**[BACK TO PREVIOUS FILE](../changelog.md)** + +--- + +# 2024-11-15 + +## Changes + +- [2024-11-15](#2024-11-15) + - [Changes](#changes) + - [NEW HARDWARE](#new-hardware) + +### NEW HARDWARE + +Support added for following hardware: + ++ [Audio Development Board For PIC32 MCUs](https://mplab-discover.microchip.com/v2/item/com.microchip.portal.evalboard/com.microchip.subcategories.modules-and-peripherals.communication.can.Others/mcu08.dm320011/1.0.0?view=about) ++ [ChipKit MAX32 Development Board](https://mplab-discover.microchip.com/v2/item/com.microchip.portal.evalboard/com.microchip.subcategories.modules-and-peripherals.communication.can.Others/mcu08.tdgl003/1.0.0?view=about) ++ [MCU CARD 11 for PIC PIC18F56K42](https://www.mikroe.com/mcu-card-11-for-pic-pic18f56k42) + +--- + +**[BACK TO PREVIOUS FILE](../changelog.md)** + +--- From 14aa790d2d2079978726d305866dfd2dd77414f2 Mon Sep 17 00:00:00 2001 From: "ivan.ruzavin" Date: Fri, 15 Nov 2024 09:11:47 +0100 Subject: [PATCH 5/5] Updated check index workflow with dbp indexing --- .github/workflows/checkIndexes.yaml | 15 ++-- .github/workflows/copyIndexesToDBP.yaml | 94 ------------------------- scripts/check_indexes.py | 12 ++++ scripts/index_to_me.py | 63 ----------------- 4 files changed, 21 insertions(+), 163 deletions(-) delete mode 100644 .github/workflows/copyIndexesToDBP.yaml delete mode 100644 scripts/index_to_me.py diff --git a/.github/workflows/checkIndexes.yaml b/.github/workflows/checkIndexes.yaml index d3d4df23f..7d361554b 100644 --- a/.github/workflows/checkIndexes.yaml +++ b/.github/workflows/checkIndexes.yaml @@ -26,6 +26,9 @@ on: schedule: - cron: "0/30 7-16 * * 1-5" # Every 30 minutes, between 07:00 AM and 04:59 PM, Monday through Friday +env: + GLOBAL_REGEX: "images_sdk|templates|mikrosdk|mcucard|mcu_card|click|mikromedia|pim|queries|sibrain|kit|board" + jobs: manual_run: if: ${{ github.event_name == 'workflow_dispatch' }} @@ -51,7 +54,7 @@ jobs: FIX_ACTION=${{ github.event.inputs.fix }} # Capture the fix input LOG_ONLY=$([[ "$FIX_ACTION" == "false" ]] && echo true || echo false) # Negate the fix input echo "LOG_ONLY is set to $LOG_ONLY" - python -u scripts/check_indexes.py ${{ github.repository }} ${{ secrets.GITHUB_TOKEN }} ${{ secrets.ES_HOST }} ${{ secrets.ES_USER }} ${{ secrets.ES_PASSWORD }} ${{ secrets.ES_INDEX_LIVE }} "--es_regex" "${{ github.event.inputs.regex }}" "--log_only" "$LOG_ONLY" + python -u scripts/check_indexes.py ${{ github.repository }} ${{ secrets.GITHUB_TOKEN }} ${{ secrets.ES_HOST }} ${{ secrets.ES_USER }} ${{ secrets.ES_PASSWORD }} ${{ secrets.ME_ES_HOST }} ${{ secrets.ME_ES_USER }} ${{ secrets.ME_ES_PASSWORD }} ${{ secrets.ES_INDEX_LIVE }} "--es_regex" "${{ github.event.inputs.regex }}" "--log_only" "$LOG_ONLY" continue-on-error: true # Ensure the workflow continues - name: Check Indexed Links - Test @@ -60,7 +63,7 @@ jobs: FIX_ACTION=${{ github.event.inputs.fix }} # Capture the fix input LOG_ONLY=$([[ "$FIX_ACTION" == "false" ]] && echo true || echo false) # Negate the fix input echo "LOG_ONLY is set to $LOG_ONLY" - python -u scripts/check_indexes.py ${{ github.repository }} ${{ secrets.GITHUB_TOKEN }} ${{ secrets.ES_HOST }} ${{ secrets.ES_USER }} ${{ secrets.ES_PASSWORD }} ${{ secrets.ES_INDEX_TEST }} "--es_regex" "${{ github.event.inputs.regex }}" "--log_only" "$LOG_ONLY" + python -u scripts/check_indexes.py ${{ github.repository }} ${{ secrets.GITHUB_TOKEN }} ${{ secrets.ES_HOST }} ${{ secrets.ES_USER }} ${{ secrets.ES_PASSWORD }} ${{ secrets.ME_ES_HOST }} ${{ secrets.ME_ES_USER }} ${{ secrets.ME_ES_PASSWORD }} ${{ secrets.ES_INDEX_TEST }} "--es_regex" "${{ github.event.inputs.regex }}" "--log_only" "$LOG_ONLY" continue-on-error: true # Ensure the workflow continues push_to_main_run: @@ -83,12 +86,12 @@ jobs: - name: Check Indexed Links - Live run: | - python -u scripts/check_indexes.py ${{ github.repository }} ${{ secrets.GITHUB_TOKEN }} ${{ secrets.ES_HOST }} ${{ secrets.ES_USER }} ${{ secrets.ES_PASSWORD }} ${{ secrets.ES_INDEX_LIVE }} "--es_regex" "images_sdk|templates|mikrosdk|mcucard|mcu_card|click|mikromedia|pim|queries|sibrain|kit|board" + python -u scripts/check_indexes.py ${{ github.repository }} ${{ secrets.GITHUB_TOKEN }} ${{ secrets.ES_HOST }} ${{ secrets.ES_USER }} ${{ secrets.ES_PASSWORD }} ${{ secrets.ME_ES_HOST }} ${{ secrets.ME_ES_USER }} ${{ secrets.ME_ES_PASSWORD }} ${{ secrets.ES_INDEX_LIVE }} "--es_regex" "$GLOBAL_REGEX" continue-on-error: true # Ensure the workflow continues - name: Check Indexed Links - Test run: | - python -u scripts/check_indexes.py ${{ github.repository }} ${{ secrets.GITHUB_TOKEN }} ${{ secrets.ES_HOST }} ${{ secrets.ES_USER }} ${{ secrets.ES_PASSWORD }} ${{ secrets.ES_INDEX_TEST }} "--es_regex" "images_sdk|templates|mikrosdk|mcucard|mcu_card|click|mikromedia|pim|queries|sibrain|kit|board" + python -u scripts/check_indexes.py ${{ github.repository }} ${{ secrets.GITHUB_TOKEN }} ${{ secrets.ES_HOST }} ${{ secrets.ES_USER }} ${{ secrets.ES_PASSWORD }} ${{ secrets.ME_ES_HOST }} ${{ secrets.ME_ES_USER }} ${{ secrets.ME_ES_PASSWORD }} ${{ secrets.ES_INDEX_TEST }} "--es_regex" "$GLOBAL_REGEX" continue-on-error: true # Ensure the workflow continues scheduled_run: @@ -111,10 +114,10 @@ jobs: - name: Check Indexed Links - Live run: | - python -u scripts/check_indexes.py ${{ github.repository }} ${{ secrets.GITHUB_TOKEN }} ${{ secrets.ES_HOST }} ${{ secrets.ES_USER }} ${{ secrets.ES_PASSWORD }} ${{ secrets.ES_INDEX_LIVE }} "--es_regex" "images_sdk|templates|mikrosdk|mcucard|mcu_card|click|mikromedia|pim|queries|sibrain|kit|board" + python -u scripts/check_indexes.py ${{ github.repository }} ${{ secrets.GITHUB_TOKEN }} ${{ secrets.ES_HOST }} ${{ secrets.ES_USER }} ${{ secrets.ES_PASSWORD }} ${{ secrets.ME_ES_HOST }} ${{ secrets.ME_ES_USER }} ${{ secrets.ME_ES_PASSWORD }} ${{ secrets.ES_INDEX_LIVE }} "--es_regex" "$GLOBAL_REGEX" continue-on-error: true # Ensure the workflow continues - name: Check Indexed Links - Test run: | - python -u scripts/check_indexes.py ${{ github.repository }} ${{ secrets.GITHUB_TOKEN }} ${{ secrets.ES_HOST }} ${{ secrets.ES_USER }} ${{ secrets.ES_PASSWORD }} ${{ secrets.ES_INDEX_TEST }} "--es_regex" "images_sdk|templates|mikrosdk|mcucard|mcu_card|click|mikromedia|pim|queries|sibrain|kit|board" + python -u scripts/check_indexes.py ${{ github.repository }} ${{ secrets.GITHUB_TOKEN }} ${{ secrets.ES_HOST }} ${{ secrets.ES_USER }} ${{ secrets.ES_PASSWORD }} ${{ secrets.ME_ES_HOST }} ${{ secrets.ME_ES_USER }} ${{ secrets.ME_ES_PASSWORD }} ${{ secrets.ES_INDEX_TEST }} "--es_regex" "$GLOBAL_REGEX" continue-on-error: true # Ensure the workflow continues diff --git a/.github/workflows/copyIndexesToDBP.yaml b/.github/workflows/copyIndexesToDBP.yaml deleted file mode 100644 index b0d3ff7b7..000000000 --- a/.github/workflows/copyIndexesToDBP.yaml +++ /dev/null @@ -1,94 +0,0 @@ -name: Copy Indexes from AWS to DBP - -on: - workflow_dispatch: - inputs: - select_index: - type: choice - description: Copy Test and/or Live ES indexed items - options: - - Test - - Live - - Both - regex: - type: string - description: Regex to use when searching for indexed items - default: "images_sdk|templates|mikrosdk|mcucard|mcu_card|click|mikromedia|pim|queries|sibrain|kit|board" - -jobs: - manual_run: - if: ${{ github.event_name == 'workflow_dispatch' }} - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.x' - - - name: Install Dependencies - run: | - python -m pip install --upgrade pip - pip install -r scripts/requirements/check_index.txt - - - name: Copy Indexed Links - Live - if: ${{ github.event.inputs.select_index == 'Live' || github.event.inputs.select_index == 'Both' }} - run: | - python -u scripts/index_to_me.py ${{ github.repository }} ${{ secrets.GITHUB_TOKEN }} ${{ secrets.ES_HOST }} ${{ secrets.ES_USER }} ${{ secrets.ES_PASSWORD }} ${{ secrets.ME_ES_HOST }} ${{ secrets.ME_ES_USER }} ${{ secrets.ME_ES_PASSWORD }} ${{ secrets.ES_INDEX_LIVE }} "--es_regex" "${{ github.event.inputs.regex }}" - - - name: Copy Indexed Links - Test - if: ${{ github.event.inputs.select_index == 'Test' || github.event.inputs.select_index == 'Both' }} - run: | - python -u scripts/index_to_me.py ${{ github.repository }} ${{ secrets.GITHUB_TOKEN }} ${{ secrets.ES_HOST }} ${{ secrets.ES_USER }} ${{ secrets.ES_PASSWORD }} ${{ secrets.ME_ES_HOST }} ${{ secrets.ME_ES_USER }} ${{ secrets.ME_ES_PASSWORD }} ${{ secrets.ES_INDEX_TEST }} "--es_regex" "${{ github.event.inputs.regex }}" - - push_to_main_run: - if: ${{ github.event_name == 'push' }} - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.x' - - - name: Install Dependencies - run: | - python -m pip install --upgrade pip - pip install -r scripts/requirements/check_index.txt - - - name: Check Indexed Links - Live - run: | - python -u scripts/index_to_me.py ${{ github.repository }} ${{ secrets.GITHUB_TOKEN }} ${{ secrets.ES_HOST }} ${{ secrets.ES_USER }} ${{ secrets.ES_PASSWORD }} ${{ secrets.ME_ES_HOST }} ${{ secrets.ME_ES_USER }} ${{ secrets.ME_ES_PASSWORD }} ${{ secrets.ES_INDEX_LIVE }} "--es_regex" "images_sdk|templates|mikrosdk|mcucard|mcu_card|click|mikromedia|pim|queries|sibrain|kit|board" - - - name: Check Indexed Links - Test - run: | - python -u scripts/index_to_me.py ${{ github.repository }} ${{ secrets.GITHUB_TOKEN }} ${{ secrets.ES_HOST }} ${{ secrets.ES_USER }} ${{ secrets.ES_PASSWORD }} ${{ secrets.ME_ES_HOST }} ${{ secrets.ME_ES_USER }} ${{ secrets.ME_ES_PASSWORD }} ${{ secrets.ES_INDEX_TEST }} "--es_regex" "images_sdk|templates|mikrosdk|mcucard|mcu_card|click|mikromedia|pim|queries|sibrain|kit|board" - - scheduled_run: - if: ${{ github.event_name == 'schedule' }} - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.x' - - - name: Install Dependencies - run: | - python -m pip install --upgrade pip - pip install -r scripts/requirements/check_index.txt - - - name: Check Indexed Links - Live - run: | - python -u scripts/index_to_me.py ${{ github.repository }} ${{ secrets.GITHUB_TOKEN }} ${{ secrets.ES_HOST }} ${{ secrets.ES_USER }} ${{ secrets.ES_PASSWORD }} ${{ secrets.ME_ES_HOST }} ${{ secrets.ME_ES_USER }} ${{ secrets.ME_ES_PASSWORD }} ${{ secrets.ES_INDEX_LIVE }} "--es_regex" "images_sdk|templates|mikrosdk|mcucard|mcu_card|click|mikromedia|pim|queries|sibrain|kit|board" - - - name: Check Indexed Links - Test - run: | - python -u scripts/index_to_me.py ${{ github.repository }} ${{ secrets.GITHUB_TOKEN }} ${{ secrets.ES_HOST }} ${{ secrets.ES_USER }} ${{ secrets.ES_PASSWORD }} ${{ secrets.ME_ES_HOST }} ${{ secrets.ME_ES_USER }} ${{ secrets.ME_ES_PASSWORD }} ${{ secrets.ES_INDEX_TEST }} "--es_regex" "images_sdk|templates|mikrosdk|mcucard|mcu_card|click|mikromedia|pim|queries|sibrain|kit|board" diff --git a/scripts/check_indexes.py b/scripts/check_indexes.py index 4a98ee685..dda97b6cb 100644 --- a/scripts/check_indexes.py +++ b/scripts/check_indexes.py @@ -22,6 +22,9 @@ def str2bool(v): parser.add_argument("es_host", help="ES instance host value", type=str) parser.add_argument("es_user", help="ES instance user value", type=str) parser.add_argument("es_password", help="ES instance password value", type=str) + parser.add_argument("me_es_host", help="MikroE ES instance host value", type=str) + parser.add_argument("me_es_user", help="MikroE ES instance user value", type=str) + parser.add_argument("me_es_password", help="MikroE ES instance password value", type=str) parser.add_argument("es_index", help="ES instance index value", type=str) parser.add_argument("--es_regex", help="Regex to use to fetch indexed items", type=str, default=".+") parser.add_argument("--log_only", help="If True, will not fix broken links, just log them to std out", type=str2bool, default=False) @@ -33,6 +36,11 @@ def str2bool(v): index=args.es_index, token=args.gh_token ) + me_es_instance = es.index( + es_host=args.me_es_host, es_user=args.me_es_user, es_password=args.me_es_password, + index=args.es_index, token=args.gh_token + ) + gh_instance = gh.repo(args.gh_repo, args.gh_token) es_instance.fetch(regex=args.es_regex) @@ -68,5 +76,9 @@ def str2bool(v): print("%sINFO: Updated \"gh_package_name\" for %s" % (es_instance.Colors.UNDERLINE, indexed_item['source']['name'])) print("%sOK: Asset \"%s\" download link is correct. - %s" % (es_instance.Colors.OKBLUE, indexed_item['source']['name'], indexed_item['source']['download_link'])) + # For new elasticsearch DBP it is crucial not to use doc_type for indexing + me_es_instance.update(None, indexed_item['doc']['id'], indexed_item['source']) + print("%sINFO: Copied \"%s\" index from AWS to DBS" % (me_es_instance.Colors.UNDERLINE, indexed_item['source']['name'])) + if err and args.log_only: sys.exit(-1) diff --git a/scripts/index_to_me.py b/scripts/index_to_me.py deleted file mode 100644 index 06cd3625f..000000000 --- a/scripts/index_to_me.py +++ /dev/null @@ -1,63 +0,0 @@ -import sys, json, argparse, requests - -import classes.class_gh as gh -import classes.class_es as es - -if __name__ == "__main__": - # Get arguments - parser = argparse.ArgumentParser(description="Upload directories as release assets.") - parser.add_argument("gh_repo", help="Github repository name, e.g., 'username/repo'", type=str) - parser.add_argument("gh_token", help="GitHub Token", type=str) - parser.add_argument("es_host", help="ES instance host value", type=str) - parser.add_argument("es_user", help="ES instance user value", type=str) - parser.add_argument("es_password", help="ES instance password value", type=str) - parser.add_argument("me_es_host", help="MikroE ES instance host value", type=str) - parser.add_argument("me_es_user", help="MikroE ES instance user value", type=str) - parser.add_argument("me_es_password", help="MikroE ES instance password value", type=str) - parser.add_argument("--es_regex", help="Regex to use to fetch indexed items", type=str, default=".+") - args = parser.parse_args() - - es_instance = es.index( - es_host=args.es_host, es_user=args.es_user, es_password=args.es_password, - index=args.es_index, token=args.gh_token - ) - - me_es_instance = es.index( - es_host=args.me_es_host, es_user=args.me_es_user, es_password=args.me_es_password, - index=args.es_index, token=args.gh_token - ) - - gh_instance = gh.repo(args.gh_repo, args.gh_token) - - es_instance.fetch(regex=args.es_regex) - - headers = { - 'Authorization': f'token {args.gh_token}' - } - - for indexed_item in es_instance.indexed_items: - asset_status = requests.get(indexed_item['source']['download_link'], headers=headers) - if es_instance.Status.ERROR.value == asset_status.status_code: ## code 404 - error, reindex with correct download link - print("%sERROR: Asset \"%s\" download link is incorrect. - %s" % (es_instance.Colors.FAIL, indexed_item['source']['name'], indexed_item['source']['download_link'])) - if 'gh_package_name' in indexed_item['source']: - url = gh_instance.asset_fetch_url_api(indexed_item['source']['gh_package_name'], loose=False) - indexed_item['source']['download_link'] = url - es_instance.update(indexed_item['doc']['type'], indexed_item['doc']['id'], indexed_item['source']) - else: - print("%sWARNING: Asset \"%s\" has no \"gh_package_name\" in the index." % (es_instance.Colors.WARNING, indexed_item['source']['name'])) - else: ## code 200 - success, no need to reindex - package_name = (json.loads(asset_status.text))['name'] - if 'gh_package_name' not in indexed_item['source']: - indexed_item['source'].update({"gh_package_name": package_name}) - es_instance.update(indexed_item['doc']['type'], indexed_item['doc']['id'], indexed_item['source']) - print("%sINFO: Added \"gh_package_name\" to %s" % (es_instance.Colors.UNDERLINE, indexed_item['source']['name'])) - else: - if package_name != indexed_item['source']['gh_package_name']: - indexed_item['source']['gh_package_name'] = package_name - es_instance.update(indexed_item['doc']['type'], indexed_item['doc']['id'], indexed_item['source']) - print("%sINFO: Updated \"gh_package_name\" for %s" % (es_instance.Colors.UNDERLINE, indexed_item['source']['name'])) - print("%sOK: Asset \"%s\" download link is correct. - %s" % (es_instance.Colors.OKBLUE, indexed_item['source']['name'], indexed_item['source']['download_link'])) - - # For new elasticsearch DBP it is crucial not to use doc_type for indexing - me_es_instance.update(None, indexed_item['doc']['id'], indexed_item['source']) - print("%sINFO: Copied \"%s\" index from AWS to DBS" % (me_es_instance.Colors.UNDERLINE, indexed_item['source']['name'], ))